Deep Learning#数学の勉強1

##ニューラルネットワーク？
簡単にいうと人間の脳を真似して作ったものです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d0215f27-1c1b-f89f-c460-8dd652f83f7e.png)
ちょっと抽象過ぎるかもしれませんが、ここで実際の例で例えて見ましょう。
トマトの色、柔らかさ、糖度でこのトマトはAランクからEランク分ける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/28201c3f-1395-7daf-7355-072e5168d03c.png)
##重み
ここでもう一つ出てくるのは重みです。
重みはニューラルと接続し、この情報の重要さ・関連度を表す指標です。
最適な重みはもちろんわからないから、この重みを求めるために機械学習を活用します。
人間は色々なトマトをみて経験と勘が蓄積されてき賢くなる。機械学習も同じく、この重みを学習します。

そして層をどんどん増やし深くになり、Deepのニューラルネットワークになります。
それの重みを学習するのはDeep Learningになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6b58da0f-7e2a-2df9-6cb0-4c626713b958.png)
ニューラルネットワークは入力値を重み付けされさんがらニューラルに流れていって、最後はなかかしらの値が出力されます。ここで大きな関数一つとして見てもよいでしょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6fcdc857-627c-e939-6157-451c4062870b.png)
##パーセプトロン
基本と数式絵としての仕組みは：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/adae8a28-fe5e-b2c3-ad86-32b355b314d0.png)
パーセプトロンはシンプルで各入力と各重みを掛け算し、最後を足し算します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c9846bf6-6446-1d8d-d17e-aade95f82b69.png)
そして結果がより小さいなら出力が0でが0より大きなら出力が1になります。
つまり：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/31fc67dd-33cf-ba6d-b498-f70f5d0459ce.png)
では数式が単なる足し算と掛け算なので、総和を使うとこうになります：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/567cdbab-85be-fe47-9303-0048071230ce.png)
そこでベクトルで入力xと重みwを表示させるとこうになります：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/613fe5b0-5f1f-e54a-5c8b-65daaadf4453.png)
このようにシンプルかけます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/0246a62c-d1e3-ad96-cf51-3ef8aaaf99c0.png)
##バイアス
いまからしきい値の表現ついて話しします。
パーセプトロンがどれくらい1を出力しやすいか、という偏りをコントロールする値です。
ちょっと数式を変換したら、こうになります：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/566de924-3a50-52c1-a517-8dd930179920.png)
そこで、bに代入します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/79601209-cca9-cde0-8afa-879b1b8a8113.png)
でも実際このバイアスがどんな風に出力を影響するでしょうか？
ここで数字を入れて確かめてみます。
b=100になると1がb=0よりはるかに出やすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/66330454-5f47-f1e3-7ea1-f61ab8ff38a8.png)
##例
次はパーセプトロン使って画像が縦長か、横長を判定してみます。
48x72の画像を入力します。本来なら重みが求めないと行けないですがちょっと面倒くさくなりますのでここで設定しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c360b58d-28c8-ec90-e0c7-6d6c4dddcb39.png)
x1=48、x2=72　w1=1、w2=-1、b=0
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/598e7bec-9618-a74f-7354-f4e783642b7e.png)
そして先書いてた内積の式を使うと：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c3d67dca-d7be-c752-cfff-95fb390111d0.png)
そのあと-24を出力が0か1かを判定します。
-24は0より小さいので出力が0です。
y=0、つまりこの画像が縦長です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/44ed29e6-5d4f-9976-5179-7dc4546185af.png)
##パーセプトロンの欠点
ここで、また例題を作りましょう。今度はパーセプトロンを使って画像が正方形かどうかを判別してみます。式は同じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/848f4875-a122-1011-dc8a-cfbcdd3e50b5.png)
ここで問題が出てきました。どうやらパーセプトロンが判定できないみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/28a3d622-45f5-72c2-f21f-761ce85c4725.png)
では、なぜ判定できないのかをちょっとみてみよう。
まず下の図を見ましょう。もしグループで分けないといけないなら、線をどう引きますか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/ac8dbd09-0b12-8ae8-b128-8c7a4f3df742.png)
左の図は一本直線で◯と☓を分けることができますが、右の図はどうでしょう。どうやっても直線で分けることができませんね。
ここで重要なPOINTとしてはー

- 直線で分離できる問題は線形分離可能と呼ばられます。
- 直線で分離できない問題は線形分離不可能と呼ばられます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/af506c8e-804e-3134-52c5-7dfbec4c3611.png)
ここで出てきたのは多層パーセプトロンです。ニューラルネットワークはこのように境界線を引くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e92749a0-eaa1-d54d-cac7-bb6c3b1d4270.png)

##多層パーセプトロン
こんな風になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/acb87f23-3526-9501-22cf-2d70a189db6e.png)
1つ1つをばらしておくと、このようにも見えます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f7876111-9a18-9915-d60d-8aebd7176564.png)
計算は難しそうですが、A、B、Cのパーセプトロンを1つずつ計算すればOKです。
それそれの重みを持って、最終は1か0かを出力するだけです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/123ca2cf-cc83-1d59-930e-1e8a62396959.png)
ばらばらになったらこうみたいですね：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/73938df4-be15-976f-6c5c-2686635586fe.png)
数式はまったく一緒です。
結果が1出力され、この入力画像は正方形ですって判別できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/a6c1863c-8dbb-bb48-992f-49e1c836654b.png)
先の正方形判定でニューラルネットワークが線形分離不可能な問題でも解けそうってわかりましたね。もう一度になりますが、このニューラルネットワークを1つ大きな関数として考えたら：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/16b6984a-60b3-93ac-7679-4f1f60b3e6ca.png)
重みの数：層同士のUnitをつなぐ線の数。
バイアスの数：その層にあるUnitの数。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/679396ab-67d8-4ee7-e631-ea9b3017bc4c.png)
表現としては：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/d2f7d7d4-de80-d3ba-bf2b-c5c0a26f114e.png)
それらの説明を踏まえて、ネットワークはこうに見えますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/97695d86-3c76-32fb-60dd-1bc91c382c49.png)
そしてベクトル表現になりますと：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/f4a1af2f-fec7-9000-e16f-bf72dd6dfa2c.png)
さらに、1層目の2つのパーセプトロンの計算式はこうにかけます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/52b84550-ee2e-7e97-464b-9ffc076ca44b.png)
いまから重みは行列、バイアスがベクトルにまとめます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1b75dc73-fb34-a0d5-5128-4a70deaf2b8a.png)
転置したベクトルを縦に並行列を作ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6f9435ac-0daa-5f4d-38ff-24d88a84bace.png)
このように2層目もこんな風に定義できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/fbfb2daa-609c-75ec-ea87-007097d37dbf.png)
次はバイアスも同じように層ごとに定義し、各層のバイアスを縦に並びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/04c70ce0-cd03-ce98-6a3b-12f1fa0d8f53.png)
今度はニューラルネットワークの図を見ましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/8b5d846b-7dde-c3ab-5418-c63fffa77061.png)
この図の第1層はこのような式で表現できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/82423074-9fd0-03d9-017d-a6da61ec3435.png)
##活性化関数
まず最初にパーセプトロンの計算するとき、内積とバイアスが0を超えるかどうかで0か1かを出力する操作がありますね。これはStep関数と言います。
このようにしきい値によって0,1を出力するような関数は活性化関数です。
英語はActivation Function。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c1e3af15-8562-2e5e-add6-6a4e3ad6c7f3.png)
例えば1つのベクトルを渡すと、各要素に対しても適用できます。
そして重みやバイアスのように層ごとに定義することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e67d2ee3-d1b7-f873-448c-8a18f109bc59.png)
もう一度見てみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/cd3b53f4-12a3-24f6-910e-bb1ad5e2eb54.png)
まず入力値x1、x2はベクトルで表すと：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/41eb9760-76cf-e482-c19e-890e558a1971.png)
統一で書きますので、0層からの入力値をこんな風に書きます：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1eee0324-e5b7-2f6a-81b9-3b441ded9e14.png)
そのあとそｓれに対して一層目の活性化関数に適用します。
つまり、活性化関数を通して隠れ層からから出力されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/13de7797-083b-7718-f6ea-03f6a62f11d4.png)
そして一層目から二層目への入力値はこうになります：(単なる一層目の出力)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/9668d8a7-765f-6a4c-e076-7e10deac2ff1.png)
今度は繰り返しして、一層目から入力値に二層目の重みやバイアスを使う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/3a4f0652-698c-ce47-b184-dfd5a4035c69.png)
そして同じく第2層の活性化関数も適用。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6d81b5ec-7941-c9b2-0b04-67b528390a74.png)
いまのネットワークは二層までなのでそのx2はそのネットワークの出力になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/646cef0c-252d-1381-22f8-787b4eb1091f.png)
まとめにいうと、ニューラルネットワークの計算は重み行列とバイアスを入力値に適用したあとに活性化関数を通す、という操作を繰り返しことです。計算はパソコンに任せ、私たちは実装するだめです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/4ed3bfd6-8237-5928-a0cc-15c2f1b43f9b.png)
##一般化
最後は一般化でまとめます。入力がn個があり、隠れ層はm個があり。
つまり、入力層のUnitはm(0)個、l層目のUnitはm(l)です。
入力層以外のニューラルネットワークの層がLである。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/814b62d7-8211-89bf-c8ba-d1656ae83e18.png)
そのとき、入力ベクトルはx(0)、l層目の重み行列はW(l)、l層目のバイアスb(l)で表示する。
注意するのは要素がずれるとW,Xの積、bの和が計算できなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/1dde5ff3-6850-aa67-a69b-dd3d6ec43b43.png)
入力ベクトルはm(0)x１になります。
そしてl層目の出力値は：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/de760b0d-f18b-0fb5-351f-a9dccf0c46d2.png)
##活性化関数についてもう少し
最後活性化関数についてもう少し話しします。
そもそも、もし活性化関数がなくなってしまったらどうになるのかな。
じゃバイアス抜きでやってみよう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/e8b9b8a7-60bb-64fd-fa3f-14a43ef40cc1.png)
なにかの活性化関数がついたら、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/775870ce-0280-66bd-5260-a48d5b32af23.png)
もし活性化関数なかったら、a(2)とa(1)を抜いてきて。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/486e93a5-b876-f719-90cf-365707bd32a7.png)
つまり、単層パーセプトロンになってしまう！まとめて表示すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/6761391a-090e-2707-eb7b-08f503bb7fcf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/536576cb-136a-cfe6-0121-727d6411dfce.png)
次出てくる話になると、じゃどんな関数を使うのか？ですね。

f(x)=xだろうかf(x)=0.3xだろうか、計算がそのまま次はの層に伝えてしまうのである。
まず非線形を使うべきじゃないかな？(シグモイド関数とか？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/3392513e-4c8f-6e28-d7ca-eeefe8b8039a.png)
でも
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154661/c49b328c-3667-b7f8-8203-e9808ce9bc3d.png)

はーい、以上です。