プログラミングというよりは数学に近い話ではありますが…
入力層、隠れ層、出力層の三層があるニューラルネットワークを考えます。ノードの発火はsigmoid関数で行います。
隠れ層のノード数をi、出力層のノード数をj個とします。
隠れ層の出力値をIi、隠れ層から出力層への重みをWij、出力層のノードの入力値をXj、出力値をOj、正しい解をTjとします。
ここで、以下の関係が成り立ちます。
Σ[k=0..k-1]Ik×Wkj = Xj
sigmoid(Xj) = Oj
ここで、誤差Ejを
Ej = (1/2) × (Tj - Oj)^2
と定義します。
EjをWijで偏微分すると、
(∂Ej/∂Wij) = (∂Ej/∂Oj) × (∂Oj/∂Xj) × (∂Xj/∂Wij)
∂Ej/∂Oj = Oj - Tj
∂Oj/∂Xj = sigmoid(Xj) × (1 - sigmoid(Xj)) = Oj × (1 - Oj)
∂Xj/∂Wij = Ii
ゆえに、
(∂Ej/∂Wij) = (Oj - Tj) × (Oj × (1 - Oj)) × Ii
となりますが、
Oj × (1 - Oj)
の部分に注目すると、この式はOjが0や1に非常に近い、つまりXjが極端に大きい、あるいは小さい場合、極端に値が小さくなってしまいます(sigmoid関数の微分なので当たり前ですが)。
この値に基づいて学習した場合、Xjが極端に大きい、あるいは小さい場合に、全く重みが更新されないという問題があるように思えます。
この問題はどのように解決すれば良いのでしょうか?
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/24 18:35