サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
blog.yusugomori.com
前回は、線形回帰・ロジスティック回帰および(シンプルな)ニューラルネットワークの出力の式を理解するところまでを考えてみました。今回はその続きを考えていきます。 一番基本的な式は線形回帰の \[ y = wx + b \] という直線の式でしたが、では、この傾き \(w\) と切片 \(b\) はどのように求めればいいでしょうか? これら \(w\)、\(b\) が、いわゆるモデルのパラメータになります。このパラメータを最適化する(=きちんと求める)ことで、線形回帰が引く直線は、「データの関係性を最もよく表す直線」になるわけです。 この式が \(y = \boldsymbol{w}^T\boldsymbol{x} + b\) になっても、あるいはロジスティック回帰の \(y = f\left(\boldsymbol{w}^T \boldsymbol{x} + b\right) \) という式
久しぶりのブログ更新です。今回は、ますます活発に研究されている深層学習分野が、その活発さ故に引き起こされてしまっている下記の問題をテーマに、記事を書いていきたいと思います。 「簡単に深層学習の手法が実装できるライブラリが出てきたことによって、実装はできるけれど実は数式部分、すなわち理論背景についてはよく知らない場合が多い」 これは個人的には非常にもったいないと思っていて、「機械学習に対する体系的な理解」ができていないことに端を発する問題だと考えています。 「体系的な理解」なんて書くとエラそうに聞こえてしまうかもしれませんが、ここで書いていくものは、「こうやって理解すると、少しはスッキリするんじゃない?」くらいの提案として受け取ってもらえれば幸いです。タイトルで「基礎体力」と書いたのもそのためです。 じゃあ具体的には何を理解すればいいの?となるわけですが、ここでひとつ、簡単な問題を考えてみま
久しぶりの更新となりました。これまでいくつかの言語で、代表的なDeep Learningの手法を実装をしてきましたが、今回はリカレントニューラルネットワーク(Recurrent Neural Networks: RNN)を実装してみたいと思います。言語は、初となるJavaScriptでトライしてみました。 完成したコードはGitHubのこちらのリポジトリにまとめてあります。 また、数式は以前にこちらにまとめましたので、理論部分についてはそちらを参考にしてください。 ではコードを紹介します。まずは核となる rnn.js から。 さて、ここで肝心なのが、冒頭にある math です。これは Python で言うところの numpy のような挙動を目指すべく、いくつか線形代数計算で必要となるところの実装をまとめたものです。リポジトリ内の math ディレクトリに色々メソッドを書いています(ただし、
Extracting and Composing Robust Features with Denoising Autoencoders [Vincent 2008] では、Deep Learning の一手法である、Denoising Autoencoders(DA)による学習手法が提案されています。 DAでは、入力データの一部をあえて損傷させ、損傷したデータを復元するような訓練を行います。その際、[Vincent 2008]には確率的勾配降下法(stochastic gradient descent, SGD)を用いればよい、との旨が書かれていますが、いざ実装しようとした時、数式が少し複雑でしたので、その導出過程についてまとめたいと思います。 記号等はなるべく文献に合わせてあるので、細かな説明は省いてあります。 また、[Vincent 2008]に従って、入力データがとる値は、0 or
これまで、PythonでDeep Learningを実装したコードを紹介してきましたが、今回はCおよびC++で実装したコードを紹介したいと思います。 実装したものは、Deep Belief Nets(DBN)、Stacked Denoising Autoencoders(SdA)となります。 コード量が多いので分かりにくいかもしれませんが、 DBN.cSdA.cDBN.cppSdA.cppの順番で掲載しています。 C言語での実装は、こちらの、C言語によるオブジェクト記述法を参考にさせて頂きました。 ヘッダーファイルなどを切り離して可読性を上げたコードは、githubのリポジトリにまとめてありますので、そちらもご参考ください。 制約付きボルツマンマシン(Restricted Boltzmann Machine)、ロジスティック回帰(Logistic Regression)、Denoising
Deep Learningの実装に関する記事が連続していますが、今回はStacked Denoising Autoencoders(SdA)について紹介します。 SdAは、前回の記事で実装したDenoising Autoencoders(DA)の層を組み合わせていくことで特徴抽出を行い、 最後の層でロジスティック回帰を用いて教師あり学習を行います。一応、SdAはDeep Belief Netsよりも画像認識では高い精度が得られているみたいです。 ソースは以下。
前回の制約付きボルツマンマシン(Restricted Boltzmann Machine, RBM)編に引き続き、今回はロジスティック回帰(Logistic Regression)のコードを紹介します。 Deep Learningにおいて、ロジスティック回帰は最後の出力層で用います。途中の層でRBMにより特徴抽出を行い、最後にロジスティック回帰によりラベルを出力して学習を行います。 ソースは以下。 重み行列のWとバイアス項のbは、確率的勾配降下法(Stochastic Gradient Descent, SGD)により更新します。その際、L2正則化を導入することで、高周波のノイズを取り除き、過学習を防ぐことができます。また、多クラス分類に用いるため、sigmoid関数ではなく、softmax関数を使っています。 コードを実行すると、交差エントロピー誤差関数が返す値が減少していくのが分かるか
Maxoutは、他のディープラーニングの手法とは異なり、活性化関数自体を学習するという、少し特殊な手法です。論文にも示されている通り、実験による精度は人気の活性化関数である rectifier (ReLU) よりも高い結果が得られていますが、そのとっつきにくさからか、敬遠されがちな気がしています。そこで、前回のCNN記事と同様、数式で Maxout function を書き下してみたいと思います。 (ちなみに、CNNはpythonで実装したものの、これまでのコードをかなり変える必要があったり、python向けに最適化できていなかったりするため、devブランチに置いています。ソースコードはこちらからご覧ください。) さて、Maxout を数式で表すために、以下の graphical model に沿って説明したいと思います。Maxoutは図の真ん中の部分で、図の左端は入力層、右端はもしdee
これまでPythonやC/C++でDeep Learningを実装してきましたが、Javaでも同様に実装しましたので、コードを紹介しようと思います。 実装したものは、DBN(Deep Belief Nets)およびSdA(Stacked Denoising Autoencoders)となります。 コードの掲載順序は下記のようになっています。 DBN.javaRBM.java(Restricted Boltzmann Machine,制約付きボルツマンマシン)SdA.javadA.java(Denoising Autoencoders)LogisticRegression.java(ロジスティック回帰)HiddenLayer.java(ニューラルネットワークの隠れ層を表すクラス)RBMはDBNの教師なし学習部分、dAはSdAの教師なし学習部分となるクラスであり、LogisticRegress
CNNは画像認識の分野で驚異的な精度を誇るディープラーニングのアルゴリズムのひとつであるものの、ぱっと見がとても複雑な構造をしているため、実装するのも大変そうです。 実際、ネットや文献上で見られる多くのCNNの実装は、Theano (pythonのライブラリ)の自動微分機能を使っていたり、MATLABの組み込み関数を使っているものがほとんどです。 そのためか、きちんと forward propagation & backpropagation を数式で書き下している文献はないように思いました。(もちろん、楽に実装できるならばそれはそれで素晴らしいことです。) そこで、どうすれば CNN を実装するための数式を書き下せるのか、レイヤーごとに分けて導出していきたいと思います。 まず、CNN がどんな層に分解できるのかについて。これは、下記の3つで表せるでしょう。 Convolution Lay
前回のpythonに引き続き、今回はjavaでDropout + ReLUを実装したコードを紹介します。package名は”DeepLearning”としました。下記の4つのファイルで構成されています。 ・Dropout.java ・HiddenLayer.java ・LogisticRegression.java ・utils.java ReLU以外の活性化関数にも対応できるよう、ラムダ式を用いて”activation”という変数に関数を入れています。 そのため、JDK 1.8 以上のみの対応になります。コードは下記です。
機械学習の分野で最近話題になってきている Deep Learning。 Deep Learningでは、何層ものニューラルネットワークを用いて訓練・予測を行いますが、各層でそれぞれ学習を行い、段階的に特徴を抽出していくのがこれまでの機械学習手法と異なる点です。 最近の動向については、 Learning Deep Architectures for AI (Bengio 2009) で詳しくまとめられています。 今回は、Deep Learningにおける各層の学習で用いられている Restricted Boltzmann Machine (RBM, 制約付きボルツマンマシン)のコードを紹介します。 ソースは以下。 Referencesにも書いてあるように、RBMを含むDeep LearningのコードはDeepLearningTutorialsにあるのですが、theanoという特殊なpyth
前回、前々回とそれぞれロジスティック回帰(Logistic Regression)、制約付きボルツマンマシン(Restricted Boltzmann Machine, RBM)を紹介しました。 手法の説明については、各記事を参照してください。 今回は、これら2つを組み合わせて実装されている Deep Belief Nets (DBN) について紹介します。今回のコードは長いので、記事の最後の方に載せています。 DBNは Greedy Layer-Wise Training of Deep Networks [Bengio 2007] で提案されている手法ですが、こちらがDeep Learningのパイオニアと言っても過言ではありません。 DBNは多層ニューラルネットワークの形をしています。従来の研究では、多層にするほど精度が下がるという問題が指摘されていましたが(多層のため誤差の重みが少
久しぶりのブログ更新となります。 今回は、Dropout + ReLU のコード(python)を紹介します。 最近の Deep Learning 界隈は、もっぱらDropoutと新しい活性化関数の組み合わせが多いみたいですね。 しばらく触れないでいる内に、以前は最前線だった Deep Belief Nets や Stacked Denoising Autoencoders がすっかり下火になってしまったようで…。 Dropout + ReLU や Dropout + Maxout などが流行っているみたいですが、これは結局、いかに疎な(sparseな)ニューラルネットワークを構築できるかが学習の鍵になっている、ということなのでしょう。シンプルが一番というべきなのでしょうか…。 ともあれ、Dropoutは実装が難しくないのは嬉しい限りです。 ReLU (Rectified Linear U
GoによるDeep Learning実装シリーズ。今回はStacked Denoising Autoencoders(SdA)になります。 ソースは以下。githubリポジトリも参考にしてください。
前回に続き、GoでDeep Learningの実装をしてみました。今回はDeep Belief Nets (DBN) です。 $ go run DBN.go で実行、もしくは $ go build -o DBN.out DBN.go でコンパイルしてから試してみてください。 ソースは以下。 DBN, HiddenLayer, RBM, LogisticRegression で構成されています。 それぞれをpackageにして見やすくしたものは、githubリポジトリからご覧ください。 (package内を参照するために、いくつかの変数を大文字から始まるように変えたりしています。)
Golangをはじめたので、練習がてらDeep Learningシリーズの実装をしてみました。 まずはロジスティック回帰(Logistic Regression)から。 Goにはクラスがないので、C言語のように構造体をつかってオブジェクト指向っぽく書いています。 ソースは以下。 (Goのインデントはハードタブを用いるのが通例らしいので、それに従っています。)
Deep Learning 実装シリーズ。今回は、Scalaです。いつもの通り、Deep Belief Nets と Stacked Denoising Auto-encoders を掲載しています。 Scalaはコンパイルしないでも実行することはできる言語ではありますが、実装したものは、一度 scalac でコンパイルしないと何も結果が出力されない作りとなっています。
PCでもモバイルでも動作するアニメーションをウェブページに付ける場合、簡単な動きならばCSS3やJavaScriptを用いることで容易に作成することができると思います。 一方で、複雑なアニメーションを実現するのはCSS3やJavaScriptでは難しく、モバイルでもFlashが使えたらなあ…と感じることが多々あるのではないでしょうか。 今回はこうした問題を解決するために、JavaScript+コマ画像を使うことにより、どんなに複雑なアニメーションでもFlashなし(およびムービーファイルなし)で作成する方法を紹介したいと思います。 サンプルはこちらです。「START」ボタンをクリックすると、画面真ん中にある三角形の画像がズームするアニメーションが開始されます。Flashは使っていませんので、モバイルでも動作が確認できるかと思います。 サンプルページにも書いてありますが、今回紹介するアニメー
前回はTowerjsでeveryauthを使ったfacebookログインを実装しましたが、今回はSocketStreamで同じことをやってみます。 同じとは言うものの、フレームワークの仕組みが全然違うので、コードの内容も全然違うものになっています。突貫で作ったので、もしかしたらもっといい方法があるかもしれません、、 手順としては、 ログインの際はまず fbUserMetadata をセッションに保存(DB検索しない)実際にビューを表示するときになって、はじめてユーザー検索をする。
iPhoneのネイティブアプリでは画面方向を縦あるいは横方向に固定できますが、Safariでは、画面の回転を防ぐ方法がありません(注1)。 そのためかは分かりませんが、PCではよく見かける横スクロールのサイトを、モバイルでは見かけません。 そこで、iPhoneの向きによらず、「絶対に横向きになるウェブページ」を作ってみました。横スクロールができるようになっています。 サンプルはこちらです。iPhoneの向きを変えて試してみてください。 画面の向きによらずスクロールを実現するために、CSS3の -webkit-transform の rotate や translate3d(x, 0, 0) を使っています。 回転によってCSSファイルを分けることによりスクロール以外の動きをCSS3のみで記述することも可能ですが、振り分けが面倒だったので、JavaScriptでCSS部分も制御しています。
今回は、Deep Learningに用いられているDenoising Autoencoders (DA))のコードを紹介したいと思います。 細かな説明や数式の導出については前回の記事で紹介してありますのでそちらも参考にしてください。 今回も、Pythonで実装しており、numpyのみを使っています。(sysはstderrへの出力に用いているのみなので、なくてもよい) コードは以下。 DAは、Deep Belief Nets(DBN)で言うところの、制約付きボルツマンマシン(Restricted Boltzmann Machine, RBM)の部分に対応しています。 (DBNの記事はこちら、RBMの記事はこちら。) DAの層を積み重ねたDeepなニューラルネットワークは、Stacked Denoising Autoencodersとなりますので、そちらも近々、実装してみたいと思います。
次のページ
このページを最初にブックマークしてみませんか?
『Yusuke Sugomori's Blog』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く