Deep Learning 3 パーセプトロンのpythonでの実装

pythonには現実、神話とわず大蛇の意味がある。
プログラミング言語Pythonを作った人は、空飛ぶモンティパイソンというコメディTVからとったと言っている。(空飛ぶモンティパイソンについて、調べてみたが、何回読んでも意味不明である。変態の考えることはいつも理解されない(不幸なことだ)。コルトパイソンのパイソンの由来は「ただ、カッコイイから」らしい。こちらのほうがまだわかる。)

バイアスの導入

\begin{eqnarray} y= \begin{cases}
0 & (w_1x_1 + w_2x_2 ) \leqq \theta \\
1 & (w_1x_1 + w_2x_2 ) > \theta \tag{1.1}
\end{cases}
\end{eqnarray}

前回説明した上式においてθ=-bとすると、

\begin{eqnarray} y= \begin{cases}
0 & (b + w_1x_1 + w_2x_2 ) \leqq 0 \\
1 & (b + w_1x_1 + w_2x_2 ) > 0 \tag{1.2}
\end{cases}
\end{eqnarray}

と変形できる。

ここでbをバイアス(bias:偏り,ゲタばき)と呼ぶ。w1,w2は前回説明したように重みである。

この実装を下に示す。

x = np.array([0,1])では 普通の言語で言うところの x[] = {0,1};である。すなわち、
x[0] = 0; x[1] = 1;である。
同様に、w = np.array([0.5,0.5]);  w[] = {0.5,0.5};であり、すなわち、
w[0] = 0.5; w[1] = 0.5;

NumPy配列(Python実装の配列)の乗算では、2つの配列の要素数が同じ場合、その要素どうしが乗算される。(C言語などでは、x[0] * w[0]; x[1] * w[1]; としなければならない。)

np.sum(w*x)については、wの配列とxの配列の乗算の和である。

\begin{equation}
f(x) = \sum_{i=0}^1 x_iw_i = x_0 \times w_0 + x_1 \times w_1\\
= 0 \times 0.5 + 1 \times 0.5 = 0 + 0.5 = 0.5
\end{equation}
とあらわされ、
すなわち、w * x = [0,  1] * [0.5,  0.5] = [0 * 0.5 , 1 *0.5] => [0,  0.5]であり、

np.sum(w*x) = 0+0.5 = 0.5;であり、各要素の総和が計算される。この総和は重み付き和とよばれ、これにバイアスを加算すれば、式(1.2)の計算は終了する。

ここで b= -0.7であり、np.sum(w*x)= 0.5であるのに、なぜ出力結果が-0.2とならず、
-0.199999…という奇妙な浮動小数点数になっているか、不思議に思うだろうが、これは演算誤差とよばれるもので、こちらを参照されたし。

オーバーフローとアンダーフローについてはこちらを参照されたし。

これはテストプログラムなので、修正を省略するが、金融系の例えばATMのプログラムでこのようなことがおきたら、どうなるか想像するだけで恐ろしいであろう。

金融系のIT企業がヤバイのは、ハッキングやウィルス、情報漏洩に加え、こういう問題に神経を削らなければいけないからである。

Deep Learning 2 パーセプトロン

パーセプトロン(あるいは、人工ニューロンや単純パーセプトロンというらしい)、は、ニューラルネットワーク(ディープラーニング)、人工知能が”学習”するのに必要な概念である(らしい)ので、ここで記述しておく。

パーセプトロンは、複数の信号として受け取り、ひとつの信号を出力する。
ここで言う「信号」とは電流や川のような「流れ」を持つイメージである。
電流が導線を流れ、電子eを先に送り出すように、パーセプトロンの信号も流れを作り、情報を先へと伝達していく。ただし、実際の電流とは違い、パーセプトロンの信号は「流す/流さない(1か0)」の二値の値。0を信号を流さない。1を信号を流すとする。

記法や概念は有限オートマトンに似ている。忌まわしいオブジェクト指向のモデリング言語(UML)の、なんかのクラス図や図形にも似ている。クラス図やオブジェクト図、ユースケース図など、あの複雑怪奇な記法を知っていたからと言って、何の役にも立たない(クラス図の表記の専門家しか精確に多重度などは描けないし、そもそも新人の技術者や組み込み系専門の技術者は読めない。さらに悪いことには、ある程度の専門家でも、描く人によって、図形が違う。)狂人のつぶやき、”図画工作の僕のおとうさん”のような物と違って、パーセプトロンは単純で明快である。

\[ x_1, x_2 は入力信号、yは出力信号、w_1,w_2は重みを表す。(wはweightの頭文字)\]

図の〇は「ニューロン」や「ノード」と呼ばれる、(脳細胞の一つと考えるとわかりやすい。)
入力信号は、ニューロンに送られる際に、それぞれに固有の重みが乗算される。
\[(w_1x_1,w_2x_2)\]
ニューロンでは、送られてきた信号の総和が加算され、その総和が限界値を超えたときのみ1を出力する。これをニューロンが発火すると表現することもある。(入力信号がストレスで、限界値を超えるとキレる(1を出力する,または発火する)と考えるとわかりやすいかもしれない。)

ここではその限界値を閾値(しきいち)と呼び、θという記号であらわす。

パーセプトロンの動作原理はこれだけである。以上のことを数式で表すと下のようになる。

 

\begin{eqnarray} y= \begin{cases}
0 & (w_1x_1 + w_2x_2 ) \leqq \theta \\
1 & (w_1x_1 + w_2x_2 ) > \theta \tag{1.1}
\end{cases}
\end{eqnarray}

パーセプトロンは、複数ある入力信号のそれぞれに固有の重み(ex.w1,w2)を持つ。そして、その重みは、各信号の重要性をコントロールする要素として働く。重みが大きければ大きいほど、その重みに対応する信号の重要性が高くなる。

人がストレスでキレる例を挙げれば、家庭のストレス、通勤のストレス、上司のストレスなど様々なストレスがあるが、ある人が、通勤、家族のストレスはあまり感じないが、上司のストレスを大きく感じる場合、通勤、家族(のストレス)の重みは小さく、上司(のストレス)の重みは大きい。

PythonでDeep Learning 1

マリア様のAIを作る計画を、並行して進行しています。

プログラミングをしてみたいんだけど、何からしていいかわからないという方は、修行する方法があります。

下記のサイトの通り、打ち込むだけです。
http://www.kumei.ne.jp/c_lang/

しかし、上記のサイトはサイト管理者の方も言語を覚えながら、打ち込んだ感が否めないため、コヒ(小比類巻さん)のようにストイックでない方は以下のサイトをお勧めします。

http://ponk.jp/

じゃあなんで最初のサイトを紹介したんだと言われると思いますが、コーディングは習うより慣れよで、最初のサイトはコードの量が半端なくあります。それを写経するだけで、かなりスキルがつくのではないかと思われます。(というのは建前で、野球部の3年がした苦労を1年2年におしつける先輩の気持ちです。)

おれっちはあたまがいいから、大丈夫だぜ、という方は、下のサイトだけで十分です。

プログラミングの言語が多すぎて何から始めていいかわからないよ!という方も多いでしょう。

私のおすすめの順番としては、HTML(CSS)→C→Java→C#(.net)です。PHPでもPerlでもPascalでも何でも構いません。C++はお勧めしません。

そのほかの言語は、標準語と関西弁の違いのように書けばわかります。プログラミング言語の基本は変わりません。オブジェクト指向も分からなくて構いません。クラスと構造体が書ければ結構です。Excelの関数ができなくても構いません。私も最近知りました。VBAやSQLもできなくて構いません。コマンドプロンプトやLinux系のコマンドになれれば、十分です。下のプロンプト画面をみてワクワクしない方はやめたほうがいいでしょう。ナニコレ!難しそう!無理なんだけど~!という方は、おやすみなさい。

json encode decode php

string json_encode ( mixed $value [, int $options = 0 [, int $depth = 512 ]] )

value を JSON 形式にした文字列を返します。

パラメータ

value

エンコードする値。 resource 型以外の任意の型を指定できます。

すべての文字列データは、UTF-8 エンコードされたいなければいけません。

注意:

PHP の実装は、 » RFC 7159 の JSON のスーパーセットです。

options

JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES,JSON_FORCE_OBJECT, JSON_PRESERVE_ZERO_FRACTION, JSON_UNESCAPED_UNICODE, JSON_PARTIAL_OUTPUT_ON_ERROR からなるビットマスク。 各定数の意味については JSON 定数のページ に説明があります。

depth

最大の深さを設定します。正の数でなければいけません。

返り値

成功した場合に、JSON エンコードされた文字列を返します。 失敗した場合に FALSE を返します。

例1 json_encode() の例

<?php
$arr = array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
echo json_encode($arr);
?>

説明

mixed json_decode ( string $json [, bool $assoc = false [, int $depth = 512 [, int $options = 0 ]]] )

JSON エンコードされた文字列を受け取り、それを PHP の変数に変換します。

パラメータ

json

デコード対象となる json 文字列。

この関数は UTF-8 でエンコードされた文字列でのみ動作します。

注意:

PHP の実装は、 » RFC 7159 の JSON のスーパーセットです。

assoc

TRUE の場合、返されるオブジェクトは連想配列形式になります。

depth

ユーザー指定の再帰の深さ。

options

JSON デコードオプションのビットマスクです。現在サポートされるオプションは JSON_BIGINT_AS_STRING のみです (デフォルトでは、大きな整数値を float に変換します)。

返り値

json でエンコードされたデータを、適切な PHP の型として返します。 truefalse および null はそれぞれ TRUEFALSE そして NULL として返されます。 json のデコードに失敗したり エンコードされたデータが再帰制限を超えているなどの場合、NULL を返します。

例1 json_decode() の例

<?php
$json = '{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));?>