損失を小さくするには、パラメータごとに損失の微分(勾配)が要る、までは分かった
でもパラメータが何億個もあるモデルで、どうやって全部の微分を出してるん
【疑問】誤差逆伝播法って、何を「逆に」伝えてるん?微分の連鎖律で手計算してみた【AI】
>>1
おさらいから。学習は、損失 が小さくなる向きにパラメータ を少し動かす、のくり返し(勾配降下法)
は学習率。必要なのは、各パラメータについての
>>2
1個ずつ少し動かして、損失がどれだけ変わるか見たらええやん
>>3
それ(数値微分)だと、パラメータ1個につき1回、モデル全体を計算し直すことになる
BERT の基本モデルはパラメータが約1億1000万個やから、1回の更新に1億回以上の計算が要る
>>4
誤差逆伝播法やとどうなるん
>>5
前向きに1回計算して、後ろ向きに1回たどるだけで、全部のパラメータの微分が出る。手間は前向きの計算の数倍程度
使ってるのは、微分の連鎖律(合成関数の微分)だけ
>>6
連鎖律のおさらいを頼む
>>7
が の関数で、 が の関数なら
途中の変数ごとの微分を、掛け算でつないでいけばいい
>>8
数字でやって
>>9
いちばん小さい2層のネットで。入力 、正解
、 なら、前向きに 、、
>>10
で、後ろ向きは?
>>11
出口から順に微分を出す
>>12
を出したら、それを の計算にそのまま使い回してるんやな
>>13
そこがポイント。出口に近い層で出した微分を、1つ前の層に渡していく。これが「誤差を逆向きに伝える」の意味
層が何十あっても、各層は受け取った微分に自分のところの微分を掛けて、前に渡すだけ
>>12
ほんまに合ってるか、数値微分で確かめたい
>>15
を にすると 、
増えた分を で割ると約 で、ほぼ12。 を にすると で、割ると約
前向きの途中の値は、覚えておかなあかんの?
>>17
要る。>>12でも、 の微分に を使ってる
学習のときにメモリをたくさん使うのは、後ろ向きの計算のために、前向きの途中の値を取っておくから
層が深いと、掛け算が続いて変なことにならん?
>>19
なる。シグモイド関数(出力を0〜1に押しこむ関数)の微分は最大でも0.25やから、10層通ると
入口に近い層ほど微分がほぼ0になって、学習が進まない(勾配消失)。微分が1になる範囲を持つ ReLU を使ったり、層を飛ばしてつなぐ残差接続を入れたりして防いでる
>>6
昔からある方法なん?
>>21
ニューラルネットの学習法として広く知られたのは、Rumelhart、Hinton、Williams の論文(1986年)から
今の深層学習のライブラリは、この後ろ向きの計算を自動でやってくれる(自動微分)。人が書くのは前向きの計算だけ
前向きに1回、後ろ向きに1回。後ろ向きは、連鎖律で微分を前の層に渡していくだけ、やな
管理人のひとこと
- 学習には各パラメータの が要る。1個ずつ動かす数値微分では、パラメータの数だけモデルを計算し直すことになる。
- 誤差逆伝播法は、前向きに1回計算し、出口から連鎖律 で微分を前の層へ渡していく。前の層は受け取った微分を使い回す。
- 例 ()で 、。数値微分でも確かめられる。
- 前向きの途中の値を取っておくのでメモリを使う。微分の掛け算が続くと勾配消失が起きる()ので、ReLU や残差接続で防ぐ。