投稿

1月, 2023の投稿を表示しています

ディープラーニングのお勉強体験記”30:番外編「XP」の各sin波コード”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコード、P216、第5章「5.5.3 RNNLMの学習コード」から作ったWindows XPの各sin波コード 前回「Windows xp」でAnacondaを使えるようにしたと紹介しました。でもって、ここではそこで動く「sin波学習コード」紹介します。わざわざ紹介する内容でもないかもしれませんが、、、、、、 「Jupyter Notebook」を使うということと(普段は「Jupyter Lab」を使ってます)、コードの先頭部分に「%matplotlib inline」を追加する、グラフの表示部分をちょっと書き換えるだけ(1波形1コマンドラインにする)と、簡単ですから、、、、、 でもまあ、一応書かせてもらいます!(簡単なことでも、それなりに苦労はしていますので) 目次 1:xp用のRNNのSIN波コード 2:xp用のLSTMのSIN波コード 3:xp用のGRUのSIN波コード 1:xp用のRNNのSIN波コード # 完成版 Windows xp用 RNNコード # ゼロから作る Deep Learning2のP216、第5章「5.5.3 RNNLMの学習コード」でコード全体が見えるようにできるだけ「import」を外した # プログラムの動作検証用にSINカーブを学習させるため変更したコード # coding: utf-8 # import sys # sys.path.append('C:\\kojin\\資料\\AI関連\\ゼロから作る Deep Learning\\ゼロから作る Deep Learning2\\deep-learning-from-scratch-2-master\\') %matplotlib inline import matplotlib.pyplot as plt import numpy as np # from common.optimizer import SGD # from dataset import ptb # このimportを有効にするには上記パス設定「sys.path.append('C:\\kojin\\AI関連\\・・・」が必要! # from simple_r...

ディープラーニングのお勉強体験記”07:RNNコード全体”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコードを全体が見えるようにする 「ゼロから作るDeep Learning 2 ―自然言語処理編」のRNNコードとして、P216、第5章「5.5.3 RNNLMの学習コード」を題材として選びました。 選んだ理由は、こちらも、「ゼロつくのコードはMITライセンス」ということなので、同じくコードを実行すると、グラフを出力するので、「コードをいじった後でも動作確認がやり易そう」だからです。 というわけで、さっそくコード全体が見えるようにできるだけ「import」を外したコードを作成しました。(私にとっては、コード全体が見えた方が、分かりやすいというのはDNNのときと同じです。) いじったコードの全体は以下になります。 # ゼロから作る Deep Learning2のP216、第5章「5.5.3 RNNLMの学習コード」でコード全体が見えるようにできるだけ「import」を外したコード # coding: utf-8 import sys sys.path.append('D:\\kojin\\資料\\AI関連\\ゼロから作る Deep Learning\\ゼロから作る Deep Learning2\\deep-learning-from-scratch-2-master\\') import matplotlib.pyplot as plt import numpy as np # from common.optimizer import SGD from dataset import ptb # このimportを有効にするには上記パス設定「sys.path.append('D:\\kojin\\資料\\AI関連\\・・・」が必要! # from simple_rnnlm import SimpleRnnlm # ハイパーパラメータの設定 batch_size = 10 wordvec_size = 100 hidden_size = 100 time_size = 5 # Truncated BPTTの展開する時間サイズ lr = 0.1 max_epoch = 100 # 学習データの読み込み(データセットを小さくする) corpus,...

ディープラーニングのお勉強体験記”06:DNNコードと数式のギャップ”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
DNNバックプロパゲーションの「アルゴリズム」と「数式」の間のちょっとしたギャップ ディープラーニングに限ったことではないと思いますが、 「理論と実際の間には、何らかの落差がある」 というのが普通なのではないでしょうか。 このDNNのコードの「アルゴリズム」と「数式」との間にも、ちょっとしたギャップを感じていて、ほんとにちょっとしたことなんだと思うのですが、それが原因でいまいち理解できない人もいるんじゃないかと思っています。 どういうことかというと、 ディープラーニングは、「入力層」、「中間(隠れ)層」、「出力層」などがあって、この層を「登ったり」「下ったり」して学習を進めるわけですね。 で、「DNNバックプロパゲーション」では、自分が注目している層を(l)層とすると、 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 「アルゴリズム」の方では 「(l)層と(l-1)層」 との関係を示している。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 一方 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 「数式」の方では 「(l)層と(l+1)層」 との関係を示している。 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ざっくり、こういう「違い(ギャップ)」があると思っています。 もうちょっと詳しくいうと、 「アルゴリズム」では、「 (l)層」で計算した結果を「 (l-1) 層」へ渡すという構造になっていますよね。つまりコードをみていると「 (l-1) 層 」を意識することになります。 一方 「数式」では、 「(l)層」は、 「(l+1)層」から作られていることが分かります。 まあ、分かっている人は、「当然じゃん!」ということなんでしょうが、どんなことであっても初心者は、「当たり前」を知りません、こういうことを教えてくれないとどんなことでも入門段階で無駄な苦労をするんですよねー。 以上です。 一応DNN(基本のニューラルネットワーク)はここまでにして、つぎは本題のRNN(リカレントニューラルネ...

ディープラーニングのお勉強体験記”05:DNNコード2層化”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「 ゼロから作るDeep Learning2ー自然言語処理編」DNNコードの中間層の2層化 少し調子に乗っているのかも知れませんが、「ディープラーニングそのものが分かったような気」になったので、「ゼロから作るDeep Learning 2 ―自然言語処理編」の全体が見えるようにしたDNNコードを少し書き換えてみます。どうしたのかというと、 中間層を2層にしてみました。 実際のコードがこちら、 「ゼロから作るDeep Learning 2 ―自然言語処理編」のDNNコード、P.45、第1章「1.4.3 学習用のソースコード」のimportをできるだけ外したものの中間層を2層化した # ゼロから作る Deep Learning2のP45、第1章「1.4.3 学習用のソースコード」でコード全体が見えるようにできるだけ「import」を外したコード # 中間層を1層追加して中間層を2層とする # coding: utf-8 # import sys # sys.path.append('..') # 親ディレクトリのファイルをインポートするための設定 import numpy as np # from common.optimizer import SGD # from dataset import spiral import matplotlib.pyplot as plt # from two_layer_net import TwoLayerNet # /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// # /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// # コード変更、追加箇所の「開始」部分 # //////////////////////////////////////////////////////////////////////////////...

ディープラーニングのお勉強体験記”04:DNNコードと数式”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「 ゼロから作るDeep Learning2ー自然言語処理編」のディープラニング”DNN”コードと数式の関係 前回、DNNのバックプロパゲーション”誤差逆伝搬”の式(活性化関数がシグモイド関数の場合) を導きました。 この関係があれば、1つ上の(l+1)層から をもらってくれば「(l)層のdL/du」を求めることができるということですね。 (いままで同様バイアスに関しては省略させてもらってます) つまり、この式に(l)層の活性化関数の微分を掛けて(今の場合シグモイド関数の微分、「(1-y)y」を掛けて) となって が得られます。(これをそのまんま、以下、コードで確認します) ここまでくると、 「数式とコードの関係をきちんと理解したい!」 となりまして、、、、、、 まず、メインルーチンを確認しますと、、、、 「class TwoLayerNet」を「model」として、インスタンス化して、「model.backward()」でバックプロパゲーション”誤差逆伝播”の計算をしているとなっています。 それではということで、「class TwoLayerNet」を確認すると、、、、、、 レイヤーが、 「Affine(W1, b1)」 「Sigmoid()」 「Affine(W2, b2)」 「SoftmaxWithLoss()」 で構成されていて、バックプロパゲーション”誤差逆伝播”の計算を、「この順番をひっくり返して行う(reversed)」というコードになっています。 ここからさらに、個々のレイヤーのバックプロパゲーション(誤差逆伝播)つまり「backward」を確認しますと、、、、、 まず、レイヤーの順番をひっくり返して、 さらに対応する、それぞれのレイヤの「backward」部分だけを書き出すと、 この4つのレイヤーを逆に並べて、「backward」からバックプロパゲーション”誤差逆伝播”を行っているというわけですね。 ここまでコードを確認したので、DNNコードと数式の関係を確認できそうです。 確認したいのは、バックプロパゲーション(誤差逆伝播)の式 が、「コードでどのように対応しているか」です。 まず、出力層の「SoftmaxWithLoss」は、Softmax関数を交差エントロピー誤差で計算しています。その場合、交差エントロピー誤差の勾配(微分)は(y - t)に...

ディープラーニングのお勉強体験記”03:DNN数式導出”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「 ゼロから作るDeep Learning2ー自然言語処理編」でDNNコードの数式導出 コード全体が見えるようになったので、私としては、アルゴリズムを追いかけやすくなりました。 ということで、次のステップは「ゼロから作るDeep Learning 2 ―自然言語処理編」P.45、第1章「1.4.3 学習用のソースコード」のDNNのバックプロパゲーションの数式を導くことにします。(DNNは一番基本的なディープラーニングのつもりです) まず、基本的なDNNでは、ニューロンが DNNのニューロン例の図:(l)層のj番目のニューロンに(l-1)層の3個のニューロンから信号が入るときの例(元になった画像は他のサイトから頂きました) という感じで表されるので、これをもとに考えると一般式は (以下ウェイト:wについて書きます、バイアス:bは端折っています) と表せます。gは活性化関数ですね。 求めたいのは、「dL/dw」ですから (wを更新するのに学習率ηを適当に設定して、      w(更新後) = w(更新前)ー η(dL/dw) とういうことを皆さんが知っているテイでお話ししてますけど、、、、、、) 上式をもとに、誤差「L」の、wjiの勾配をチェーンルールに従って変形すると となるので、誤差「L]のwjiの勾配は を求めれば、得られることになります。 では、「dL/du」をどうやって求めるのか? このときに、誤差逆伝播法、バックプロパゲーションの登場となるわけですね。 早速、「l層のdL/du」を「l+1層のdL/du」にチェーンルールで書き換えると 上記の2行目から3行目はバイアスbをuで微分すると”0”なので先に落としました。 さらに、y=g(u)を使って 最終的に が得られます。 ちなみに、gがシグモイド関数の場合は、uで微分すると となりますので、 とも表せます。 誤差逆伝播とは、上式が、  「dL/du(l+1)層」 から 「dL/du(l)層」が得られる! ことを表しているためにそう呼ばれているんですね。(のはず、、、、) むかし習った数列に似ているようです。何らかの方法で、「最初の項が分かればあとは順番に求まっていく」ということです。ただ、誤差逆伝播法の場合は「最初の項」ではなくて「最後の項」から始まって、逆の順番に求まっていくというところが数列とちょっと違う...

ディープラーニングのお勉強体験記”02:DNNコード全体”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
「 ゼロから作るDeep Learning2ー自然言語処理編」のDNNコードを全体が見えるようにする さて、ひとしきり、めぼしい書籍を読んで分かった(ような気になった)ので、まず、 「コードをちゃんと理解したい!」 となりまして、「ゼロから作るDeep Learning 2 ―自然言語処理編」のコードをいじってみることにしました。 「ゼロから作るDeep Learning 2 ―自然言語処理編」のDNNコードとして、P.45、第1章「1.4.3 学習用のソースコード」を題材として選びました。 1つには、ゼロつくのコードはMITライセンスということなので、コードをいじってもブログに載せれますし、、、、、 さらに、コードを実行すると、グラフと図を出力するので、コードをいじった後でも正常動作の確認が簡単だと思ったからです。 で、さっそくコード全体が見えるようにできるだけ「import」を外したコードに変更しました。 (私の場合、コード全体が見えていないとちっともわからないので) 最初はimportを外して、classを追加するだけにしたかったのですが、、、、 「スパイラルデータ」がうまく読み込めなかったり、オリジナルの「class SoftmaxWithLoss」のコードが難しくてコードの意味が分からず、仕方なく「ゼロから作るDeep Learning 」の第1巻からコードをもらってくるなど、なんだかんだと、そこそこいじることになりました。 ちなみにいじったコードの全体は以下になります。 「ゼロから作るDeep Learning 2 ―自然言語処理編」のDNNコード、P.45、第1章「1.4.3 学習用のソースコード」で全体が見えるようにできるだけ「import」を外したコード # ゼロから作る Deep Learning2のP45、第1章「1.4.3 学習用のソースコード」でコード全体が見えるようにできるだけ「import」を外したコード # coding: utf-8 # import sys # sys.path.append('..') # 親ディレクトリのファイルをインポートするための設定 import numpy as np # from common.optimizer import SGD # from dataset import ...

ディープラーニングのお勉強体験記”01:きっかけ”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

イメージ
 「AIを勉強し始めたきっかけ」と「ざっくり経緯」 もう50歳も半ばを過ぎてすっかり老けてしまった、いち会社員ですが、、、、、 2021年の12月の頃です。 ノートパソコンで、アマゾンの書籍コーナーをぼんやり見ていたとき、 「人工知能概論 単行本 – 1992/1/1 荒屋 真二  (著)」 の書籍に出くわしました。 「ふーん、人口知能、、、、、、、最近AIとかよく聞くし、これは古本で、本体は100円もしないし、ちょっとくらい知っておいた方が良いかも、、、、、」 ということで購入しようと思ったのですが、、、、、一瞬 「ちょっと待てよ、購入前に少しネットで調べてみよう」 と思い直して、ネットで情報を調べることにしました。しらべていくと、どうやら 「進歩の著しい分野」 「できるだけ最新情報を入手するべき」 「とくに機械学習が注目されている」 「ディープラーニングが一番ホット」 らしいことが分かってきました。 「中古本の購入は止めておこう、でも、人工知能は気になるし、なるべく新しくて人気のAI関連書籍を買ってみよう」 と考えて、アマゾンをいろいろ見て回った結果、とても人気のあった以下の書籍を購入しました。 注文日       書籍名 著者 2022年1月18日   ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装 斎藤 康毅 注文日       書籍名 著者 2022年1月18日   Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎 Andreas C. Muller 2冊とも書評もよかったし、とくに「ゼロから作るDeep Learning」はものすごい人気のある書籍なので大いに期待したのですが、、、、、、 届いた書籍の中身を見てびっくり、 「うわー全然分からない!いきなりこんなもの読めない!」 中の体裁が「私好みではない構成」だったのと、「Pythonを知らなかった」ので、買ってから 「しまった!」 という感じでした。でも乗りかかった船だし、なんか面白そうだし、で、 注文日       書籍名 著者 2022年1月21日   スッキリわかるJava入門 第3版 (スッキリわかる入門シリーズ) 中山清喬 注文日       書籍名 著者 2022年1月21日 ...

このブログの人気の投稿

ディープラーニングのお勉強体験記”17:LSTM数式導出”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

ディープラーニングのお勉強体験記”30:番外編「XP」の各sin波コード”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)

ディープラーニングのお勉強体験記”18:LSTMコードと数式”(リカレントニューラルネットワーク”RNN”を中心にバックプロパゲーション”BPTT”を数式を使って理解したい!)