しつこいですが「学習用のデータ群から、この『パラメータ』を調整して入力を再現するような出力を出せるようにする」のがAutoEncoderの学習です。この学習はよく、入力と出力の平均2乗誤差の最小化問題や交差エントロピーの最小化問題として捉えられます(数式割愛)。その学習(パラメータの更新)ですが、主に以下の2種類に分ける事が出来ます。バッチアルゴリズムオンラインアルゴリズム詳しく分けるともう少し分けられますが主にこの2種類となります。2つの大きな違いとして、「いつパラメータを更新するか」があります。最小化問題はその時点の勾配を見る事で最小点に近づいていく訳ですが、バッチアルゴリズムでは、その時点での全てのデータの全ての勾配を計算し、その平均を利用してパラメータを更新します。それに対してオンラインアルゴリズムでは、ランダムに選んだ1サンプルから勾配を計算してパラメータを更新します。勾配の計算は微分やらなんやらで計算量も多くなる訳ですから、その回数が減るオンラインアルゴリズムは計算量が少なく早いと言えます。バッチアルゴリズムは多くのデータの平均というより正確な勾配を計算するので、収束率が良くなります。(上手い表現ではなくすみません。その上実はこの関係は絶対でなかったりするので一概には言えません・・・)AutoEncoderでは一般的にオンラインアルゴリズムが使われています。理由としては早さが挙げられると思います。多くの学習データを見ることや、DeepLearningのように多層に繋げる場合も考えると学習の早さはかなり重要になるからです。その中でもSGD(StochasticGradientDescent:確率的降下勾配法)というアルゴリズムがよく用いられます。SGDはデータ点の誤差の和で表現される最適化問題(AutoEncoderのような問題)に使われるアルゴリズムで、誤差の和の平均(期待値)の面倒な勾配計算をデータの実現値を用いて解決します。具体的にSGDの学習をパラメータ毎に式に起こすと以下のようになります。目的関数(交差エントロピー等)です。1回の更新の幅を調整する式になります。Blogに第二項の微分式の導出過程も掲載されています。これに基づいてパラメータを更新していけば出来るAutoEncoderの学習が行える訳です。パラメータ更新の3式の実装はリンク先のブログの数式をそのまま実装する事で苦労はしないと思います。よってより苦労する事なく短いソースコードで実現する事が出来ます。さいごに、C言語等の配列でも実装すべく、配列同士の微分式を考えます。ライブラリ等を使わない場合ですね。こちらは、研究室で悩んだ挙句先生が「暇つぶしにやったよw」と言って考えてくれた資料になります。考えないと出来ない数式なのでかなり尊敬しています。本当にこの研究室で良かった。https://skydrive.live.com/redir?resid=4834E9356B3DA117%21111以上でAutoEnocederを実装まで持っていけると思います。(多分)交差エントロピーを使った話は発生確率の話から入りややこしくなるので「誤差を最小にする」用の目的関数ですと割愛しました。その他不明な点や、ご指摘等はコメントでお願いします。//----------初学者であった自分が分かりづらかった点をなるべくわかりやすく、次の初学者の為にと書きました。「初学者の癖に文面ガー」等の意見があると思いますが、これから大学院生となってさらに向上していきたいと考えていますので熱い応援よろしくお願いします。-スターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。