FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Pythonで機械学習の進捗 §3-1

3章からいよいよ機械学習の基礎を成すニューラルネットワークの紹介になります。
ニューラルネットワークとは何でしょうか。
簡単に言えば、2章で学んだパーセプトロンを組み合わせたものです。
3.1ではこのことが丁寧に紹介されています。

私は始めて図3-1を見たとき、「なぜ中間層があるのだろうか。入力から直接出力へ向かう構造の方が単純で良いではないか」と考えました。
ニューラルネットワークがパーセプトロンの組み合わせだと考えれば、図3-1を見て納得することができます。
中間層がある理由、それは2.4節で見たXORゲートのように単純ではないパーセプトロンを組み込むからです。
図2-13を見れば分かります。この図が「パーセプトロンの組み合わせ」つまり、「ニューラルネットワーク」だと考えれば、第0層が入力層、第1層が中間層、第2層が出力層に対応しています。

次の節3.2では活性化関数が登場します。
活性化関数として、ステップ関数とシグモイド関数の2つが紹介されています。
活性化関数はこの2つ以外にもいくつかありますが、機械学習を行う上ではこの2つを知り、区別して使えば実装できるということです。

では、活性化関数とは何をしているのか。それは必要ない情報を捨てていることです。
ステップ関数は0を境にいるいらないを区別しており、シグモイド関数は0に近い情報はいらず1に近い情報が重要であると区別しているのです。
そもそも、私たち人間がものを見て判断する際に、目に見える情報をすべてを認識していません。
例えば、目の前にリンゴが置いてあります。「目の前にある果物はなんですか?」と問われたら、目で見てリンゴだと認識し「リンゴです」と答えます。この時にリンゴが皿の上に置いてあることや背景に見える物は認識していないことが言えます。
つまり、「必要な情報だけを取り出す」ということは「必要ない情報を捨てる」ということです。
なので、活性化関数が行っていることは、人間が無意識に行える「必要ない情報を無視する」処理なのです。

この調整を行えばより精度の高い学習結果が得られると期待できます。そして、この調整の部分はすでに他の人が作った良いものを流用して機械学習させる「Fine tuning」という手法もあります。
私の余裕があれば「Fine tuning」の紹介もしたいですね。

Pythonで機械学習の進捗 §2-3

2.4では「パーセプトロンの限界」という題がついています。
2章で見てきた論理回路のうち3つをpythonでも実装することができると。ここで見ていくのはそのどれとも違うXORゲートというものです。
これは排他的論理和とも呼ばれます。その仕組みとしては、同じ値が入力されれば0を、異なる値が入力されれば1を出力するものです。
ここだけ聞けば、なんの変哲もない論理回路の1つとしか感じません。実際に、パーセプトロンの作り方を無視して実装しようとするならばifを用いて簡単に作ることができます。

では、この章で一所懸命に説明していることは何か。
それは”パーセプトロン1つで実装できない論理回路をいくつか使用すれば実装できる”ということです。
結論を先に述べると、XORゲートはANDゲートとNANDゲートとORゲートの3つを組み合わせればパーセプトロンの作り方で作れます。

本の中ではなぜパーセプトロンの作り方でXORゲートが実装できないのかを説明しています。
図や線型/非線形といった単語が出てきて説明をされて、だた読んでいくと、すごく分かりづらい箇所だと感じました。
かみ砕いて説明するならば、
パーセプトロンの作り方とは実は直線で0と1の部分に分けていると言うこと。
そして、XORでは直線1本では、うまく分けることが出来ないこと。

線型/非線形とは何なのか。一言で示すなら「線型とは直線のこと、非線型とは直線以外のこと」です。
数学的にはもっと厳密な定義があるのですが、ここでは必要ないでしょう。

2.5の部分でXORゲートが組み合わせで作れることが示されます。
どのように実装するのかは本に載っているので省略します。
私がここでもったいないと思うことは図2-6や図2-8でわざわざ視覚的にわかりやすく場合分け出来ること(また、場合分けしたいこと)を示しているのに、組み合わせてXORゲートを実装した場合にどのような図になるのかが乗っていないのです。
図で表したものが下になります。



当たり前ですが、直線を2本使えば分けられるということです。

この章で本が伝えたかったことは何だったのでしょうか。
それは、パーセプトロンの考え方と「バイアス」「重み」といった今後使う用語の説明をしたかったことです。
それ以外はありません。
なぜならここまで一所懸命に説明した論理回路はこの後使われなくなるからです。
もちろん本当に基礎的な部分を支える考え方として論理回路は重要なのですが、pythonで機械学習を実装する上では知らなくてもできるということです。

Pythonで機械学習の進捗 §2-2

2.2では「論理回路」の紹介がされています。

ここで紹介されるものは、もっとも単純な論理回路となっています。何が単純なのか。それは入力の数が2つで出力が1つだからです。
論理回路を考える際に入力される値は「0」か「1」のいずれか(論理学などでは「True」or「False」)です。
入力が1つの時は出力も1つしかなく、入力された値がそのまま出力される値となる為、回路と呼ぶにはあまりにもなさ過ぎます。
なので、もっとも単純な論理の回路は入力が2つある場合なのです。

本では真理値表を使用してANDゲート(またはAND回路と呼ぶ)とNANDゲート、ORゲートが紹介されています。
一般的に論理回路を考える際に用いられるのが真理値表であり、用いるメリットとして入力数が少ない内はコンパクトに収まることです。
他の表現方法として(私が知る限りでは)二分木で表現する方法があります。下の図が二分木の形となります

こちらのメリットは入力数が増えた際にも見やすく、表の省略や圧縮の方法が理論的に確立しているので考えやすいことです。

話は逸れましたが、ANDゲートとNANDゲート、ORゲートをパーセプトロンで表せることはすぐに分かります。
2.3ではその実装ということで、pythonを用いてそれぞれを実装します。
プログラムは単にifで分岐させています。当然4つの場合分けするのではなく、2つの場合分けを行います。結果は2通りなので、自然な発想です。
また、ここで「重み」と「バイアス」の導入があります。実装をする上でバイアスをつける必要はないのですが、3章で使用する為にここでわざわざ紹介しています。

私が2章で一番面白く感じた箇所は「XORゲート」の紹介部分ですが、その感想については次の記事で。

Pythonで機械学習の進捗 §2-1


本の2章から、いよいよアルゴリズムに触れます。

2.1で「パーセプトロン」の紹介がされます。
パーセプトロンが何であるかの説明は本を見てもらうとして・・・
私の感想を中心にまとめます。

パーセプトロンの「信号」の考え方は、すんなり理解できました。
私はドミノ倒しを想像し、次々に伝わっているというイメージを持ちました。
数学でも関数列と似ていると感じました。

それに対して「ニューロンが発火する」と表現される部分を理解するまでに、少し間が必要でした。
新たに出てくる単語を確認するのに手間取ったことが1つ。
もう1つは0と1を出力することの違いを分からなかったことです。
後者について、数学により多く触れてきた私にとって"数字"は"ただの数"でしか無かったので、違いに気がつくことに遅れました。
その違いとは0/1がOFF/ONに対応しているということ。知っている人からすれば至極当然のことですが、分からない人からするとそのことに思い付くまで少しの間が必要なのかなと思います。
javaなどではTrue/Falseを使用しています。

では、なぜここでON/OFFやTrue/Falseにしないのか。
それは「信号」の考え方を使いたいからです。
入力で受け取るもの(入力信号)が数値なので、出すもの(出力信号)も数値にしたい。そうすることで出力した値を別のニューロンの入力信号として渡すことができます。そうして次々に繰り返すことができると。
この組み合わせによって、1つ1つは単純な値だったのが複雑な表現を可能にします。

このことは忘れがちですが、とても重要な考え方です。私も忘れないように気をつけようと、感想をまとめながら思いました。

Pythonで機械学習の進捗 §1

前回Anacondaをインストールして、あれこれしてpython3の環境を整えたのでpythonを色々いじっていきます。

pythonとjavaは似ている部分が多かったので、私がpythonに慣れるまで時間はかからなかったです。
pythonとjavaの相異点をいくつか抜粋すると以下の通りです。

  • pythonインタプリアは対話モード

  • 私自身がこの点の利点を把握していないので詳しく説明できません。本ではこういった点からpythonでの機械学習を進めているようです。

  • pythonの変数はデータ型を宣言しない

  • pythonは「動的型付き言語」に分類されるプログラミング言語です。変数の型がなんなのかをpythonが判断してくれます。
    javaと比べると異なる型の演算が楽に計算できるので、その点がメリット。

  • pythonは空白文字に意味がある

  • pythonではif文やfor文、関数などの中身を区別するために、4つの空白文字を頭につけます。これはインデントを表しています。
    javaでは{}で中身を区切るので大きな違いでした。

  • pythonにはNumPyやMatplotlibなどの外部ライブラリが便利

  • 機械学習には行列計算を多く使うので、それが簡単に使用できるNumPyは非常に便利です。ブロードキャストによって、行列のスカラー倍も行えます。
    Matplotlibはグラフを描写できます。javaではいちいち点をファイルに出力し、それを別のアプリで描写するので、pythonの方が楽に使えて便利です。

以上の4つが私の印象に残ったpythonとjavaの相異点です。
javaに比べてpythonは計算を多く含むプログラムに適したプログラミング言語だと感じます。
より詳しい話は本(ゼロから作るDeepLearning)の§1(p.4~p.20)を参照してください。
プロフィール

yamoto.tvp

Author:yamoto.tvp
FC2ブログへようこそ!
大学の数学科に通うほど、数学が好きな私です。
趣味で勉強している”機械学習”などの進捗を載せています。

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。