読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】誤差逆伝播法って、何を「逆に」伝えてるん?微分の連鎖律で手計算してみた【AI】

23レスカテゴリ:AI・機械学習
1: 名無しさん

損失を小さくするには、パラメータごとに損失の微分(勾配)が要る、までは分かった
でもパラメータが何億個もあるモデルで、どうやって全部の微分を出してるん

2: 名無しさん

>>1
おさらいから。学習は、損失 が小さくなる向きにパラメータ を少し動かす、のくり返し(勾配降下法)

は学習率。必要なのは、各パラメータについての

3: 名無しさん

>>2
1個ずつ少し動かして、損失がどれだけ変わるか見たらええやん

4: 名無しさん

>>3
それ(数値微分)だと、パラメータ1個につき1回、モデル全体を計算し直すことになる
BERT の基本モデルはパラメータが約1億1000万個やから、1回の更新に1億回以上の計算が要る

5: 名無しさん

>>4
誤差逆伝播法やとどうなるん

6: 名無しさん

>>5
前向きに1回計算して、後ろ向きに1回たどるだけで、全部のパラメータの微分が出る。手間は前向きの計算の数倍程度
使ってるのは、微分の連鎖律(合成関数の微分)だけ

7: 名無しさん

>>6
連鎖律のおさらいを頼む

8: 名無しさん

>>7
が の関数で、 が の関数なら

途中の変数ごとの微分を、掛け算でつないでいけばいい

9: 名無しさん

>>8
数字でやって

10: 名無しさん

>>9
いちばん小さい2層のネットで。入力 、正解

、 なら、前向きに 、、

11: 名無しさん

>>10
で、後ろ向きは?

12: 名無しさん

>>11
出口から順に微分を出す

13: 名無しさん

>>12
を出したら、それを の計算にそのまま使い回してるんやな

14: 名無しさん

>>13
そこがポイント。出口に近い層で出した微分を、1つ前の層に渡していく。これが「誤差を逆向きに伝える」の意味
層が何十あっても、各層は受け取った微分に自分のところの微分を掛けて、前に渡すだけ

15: 名無しさん

>>12
ほんまに合ってるか、数値微分で確かめたい

16: 名無しさん

>>15
を にすると 、
増えた分を で割ると約 で、ほぼ12。 を にすると で、割ると約

17: 名無しさん

前向きの途中の値は、覚えておかなあかんの?

18: 名無しさん

>>17
要る。>>12でも、 の微分に を使ってる
学習のときにメモリをたくさん使うのは、後ろ向きの計算のために、前向きの途中の値を取っておくから

19: 名無しさん

層が深いと、掛け算が続いて変なことにならん?

20: 名無しさん

>>19
なる。シグモイド関数(出力を0〜1に押しこむ関数)の微分は最大でも0.25やから、10層通ると

入口に近い層ほど微分がほぼ0になって、学習が進まない(勾配消失)。微分が1になる範囲を持つ ReLU を使ったり、層を飛ばしてつなぐ残差接続を入れたりして防いでる

21: 名無しさん

>>6
昔からある方法なん?

22: 名無しさん

>>21
ニューラルネットの学習法として広く知られたのは、Rumelhart、Hinton、Williams の論文(1986年)から
今の深層学習のライブラリは、この後ろ向きの計算を自動でやってくれる(自動微分)。人が書くのは前向きの計算だけ

23: 名無しさん

前向きに1回、後ろ向きに1回。後ろ向きは、連鎖律で微分を前の層に渡していくだけ、やな

管理人のひとこと