FC2ブログ
03«1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.»05

たまひびとらの絵本の実

読書好きな姉妹と弟と父母の読んだ本

あたらしい機械学習の教科書 

kikaigakushuunokyoukasho.jpg
Pythonで動かして学ぶ! あたらしい機械学習の教科書
Pythonで動かして学ぶ! あたらしい機械学習の教科書

その①
まずChapter 5 まで。多数のデータを行列に代入していく処理が必要になる。本にある最小二乗法を試行錯誤的に求めるプログラム(ある初期値から少しずつ改善し、改善がほぼなくなったら終わり、という求め方)に若干のみ変更を加えて作ってみたけど、解析解に必ずしも近づかない。最小二乗値の曲面の形、または、初期値・その他のパラメーターの設定の問題なのかなと思う。一筋縄じゃいかないね。Chapter 5 の残りの内容はこの方のスライドに近い。

import numpy as np

X_min = 10
X_max = 15
X_n = 500
X = 10 + 5 * np.random.rand(X_n) # 一様乱数Xn個からXをXn個作る
Para = [160, 0.17]
T = Para[0] * (1 - np.exp(-Para[1] * X)) + 3 * np.random.randn(X_n) #最後の項は正規分布Xn個

def mse_line(x, t, w):
y = w[0] * x + w[1]
mse = np.mean((y - t)**2)
return mse

def dmse_line(x, t, w):
y = w[0] * x + w[1]
d_w0 = 2 * np.mean((y - t) * x)
d_w1 = 2 * np.mean(y - t)
return d_w0, d_w1

def fit_line_num(x, t):
w_init = [10, 100] #初期値
alpha = 0.0005 # 改善するときの歩幅の大きさ
i_max = 1000 # for文を最大何回行うか
eps = 0.1 # for文からbreakするためのd_w0, d_w1の低さ
w_i = np.zeros([i_max, 2]) #計算の入れ物としてのゼロ行列を用意
w_i[0, :] = w_init #初期値を入れ物に入れる
for i in range(1, i_max): #最高i_max -1回繰り返す
dmse = dmse_line(x, t, w_i[i - 1])
w_i[i, 0] = w_i[i - 1, 0] - alpha * dmse[0]
w_i[i, 1] = w_i[i - 1, 1] - alpha * dmse[1]
print('w [{0:.2f},{1:.2f}]'.format(w_i[i,0],w_i[i,1]))
if max(np.absolute(dmse)) < eps: # 終了判定
break
w0 = w_i[i, 0]
w1 = w_i[i, 1]
print('The number of trial: ', str(i))
return w0, w1

W0, W1 = fit_line_num(X, T)
print('Estimated W=[{0:.2f}, {1:.2f}]'.format(W0, W1))
print('MSE={0:.2f}'.format(mse_line(X, T, [W0, W1])))

def fit_line(x, t):
mx = np.mean(x)
mt = np.mean(t)
mtx = np.mean(t * x)
mxx = np.mean(x * x)
w0 = (mtx - mt * mx) / (mxx - mx**2)
w1 = mt - w0 * mx
return np.array([w0, w1])
W = fit_line(X, T)
print("True w0={0:.3f}, w1={1:.3f}".format(W[0], W[1]))

その②
Chapter 6、今度は分類。分類は確率。確率は0から1までの値をとるのでロジスティック回帰モデルが適する。分母のexpの中に線形結合式を入れ、パラメーターは scipy の minimize で求める。確率モデルで二乗誤差合計の役割を果たすのが、交差エントロピー誤差関数(cross entropy error function)。交差エントロピー誤差関数は最尤推定の尤度関数の対数をとって符号をマイナスにしたもの(よって最小になったときもっともフィッティングすると言える)。下のプログラムは教科書から微妙にだけ変えてみた(自分にわかりやすいように)。

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
from scipy.optimize import minimize
%matplotlib inline

N = 50 #疑似サンプル作成
K = 2 #分類の数
T2 = np.zeros((N, 2)) #dtype=np.uint8 を削除した
X = np.zeros((N, 2))
X_range0 = [-3, 3]
X_range1 = [-3, 3]
Mu = np.array([[-.5, -.5], [.7, 1.0]])
Sig = np.array([[0.8, 0.9], [1.2, .3]])
Pi = np.array([0.5, 1.0])
for n in range(N):
wk = np.random.rand()
for k in range(K):
if wk < Pi[k]:
T2[n, k] = 1
break
X[n, 0] = (np.random.randn() * Sig[T2[n, :] == 1, 0] + Mu[T2[n, :] == 1, 0])
X[n, 1] = (np.random.randn() * Sig[T2[n, :] == 1, 1] + Mu[T2[n, :] == 1, 1])

def logistic2(x0, x1, w):
y = 1 / (1 + np.exp(-(w[0] * x0 + w[1] * x1 + w[2])))
return y

def show_data2(x, t):
wk, K = t.shape
c = ['red', 'blue']
for k in range(K):
plt.plot(x[t[:, k] == 1, 0], x[t[:, k] == 1, 1], linestyle='none', markeredgecolor='black', marker='o', color=c[k], alpha=0.8)
plt.grid(True)

def show3d_logistic2(ax, w):
xn = 50
x0 = np.linspace(X_range0[0], X_range0[1], xn)
x1 = np.linspace(X_range1[0], X_range1[1], xn)
xx0, xx1 = np.meshgrid(x0, x1)
y = logistic2(xx0, xx1, w)
ax.plot_surface(xx0, xx1, y, color='blue', edgecolor='gray', rstride=5, cstride=5, alpha=0.3)

def show_data2_3d(ax, x, t):
c = ['red', 'blue']
for i in range(2):
ax.plot(x[t[:, i] == 1, 0], x[t[:, i] == 1, 1], 1 - i, marker='o', color=c[i], markeredgecolor='black', linestyle='none', markersize=5, alpha=0.8)
ax.view_init(elev=25, azim=50)

def show_contour_logistic2(w):
xn = 30
x0 = np.linspace(X_range0[0], X_range0[1], xn)
x1 = np.linspace(X_range1[0], X_range1[1], xn)
xx0, xx1 = np.meshgrid(x0, x1)
y = logistic2(xx0, xx1, w)
cont = plt.contour(xx0, xx1, y, levels=(0.2, 0.5, 0.8), colors=['k', 'green', 'k'])
cont.clabel(fmt='%1.1f', fontsize=10)
plt.grid(True)

def cee_logistic2(w, x, t):
X_n = x.shape[0] #shape[0]は行数、shape[1]は列数
y = logistic2(x[:, 0], x[:, 1], w)
cee = 0
for n in range(len(y)):
cee = cee - (t[n, 0] * np.log(y[n]) + (1 - t[n, 0]) * np.log(1 - y[n]))
cee = cee / X_n
return cee

def dcee_logistic2(w, x, t):
X_n=x.shape[0] #shape[0]は行数、shape[1]は列数
y = logistic2(x[:, 0], x[:, 1], w)
dcee = np.zeros(3)
for n in range(len(y)):
dcee[0] = dcee[0] + (y[n] - t[n, 0]) * x[n, 0]
dcee[1] = dcee[1] + (y[n] - t[n, 0]) * x[n, 1]
dcee[2] = dcee[2] + (y[n] - t[n, 0])
dcee = dcee / X_n
return dcee

def fit_logistic2(w_init, x, t):
res = minimize(cee_logistic2, w_init, args=(x, t), jac=dcee_logistic2, method="CG")
# jac は目的関数の勾配ベクトル(Jacobian),入力パラメータの各変数での1次導関数
return res.x # minimizeはx以外の数値も返すので、x出力を指定する

plt.figure(1, figsize=(15, 8))
plt.subplots_adjust(wspace=0.5)

Ax = plt.subplot(1, 2, 1, projection='3d')
W_init = [1, 1, 1]
W = fit_logistic2(W_init, X, T2)
print("w0 = {0:.2f}, w1 = {1:.2f}, w2 = {2:.2f}".format(W[0], W[1], W[2]))
show3d_logistic2(Ax, W)
show_data2_3d(Ax, X, T2)
cee = cee_logistic2(W, X, T2)
print("CEE = {0:.2f}".format(cee))

Ax = plt.subplot(1, 2, 2)
show_data2(X, T2)
show_contour_logistic2(W)
plt.show()

その③
Chapter 7 ニューラルネットワークに来た。読むというよりは解読。数式・プログラムで長考必要なところがある。フィードフォーワードモデル、つまり信号(計算数値)が逆戻りしないで、入力層から出力層に進むタイプ。2層であれば、入力層→中間層(入ってきた数値をシグモイド関数で変換)→出力層(入ってきた数値をソフトマックス関数で変換)となる。入力層での入力数×中間層のニューロン数 + 中間層のニューロン数×出力層での出力数 = 計算必要な重みパラメーターの数 (細かく言えば、ダミー定数 +1 が入る項あり)。そのパラメーターの2ブロックを1つの行列に合体させて、行列各要素数値を、勾配法で少しづつ改善していって求める。改善の方向は、交差エントロピー誤差関数の数値微分値または解析微分値で決める。本書のP284-297あたりの説明がいいと思うんだけど、微分値で学習して係数計算をやり直すという学習プロセスは、最終誤差がニューラルネットワークを逆に伝っていくことと同義。へぇーよくできてんね! もうこのあたりになると自分でプログラムを書き換える元気なし。行列をいろいろ変換するスクリプトとかで一部理解不足もあるし(reshape(-1)とreshape(1, X))の違いなど。
* reshape(-1)はPythonによる自動行列サイズ調整でした

シグモイド関数はソフトマックス関数の簡単なバージョン。両関数とも微分がおもしろい形になる。さて、なぜニューラルネットワークではシグモイド・ソフトマックスを使うのか。必然性はなくて、相性みたいだね。

その④
Chapter 8はニューラルネットワーク応用編で手書き数字の認識。自分でニューラルネットワークを構築して重みパラメーターを計算するのはつらいので、ディープラーニング用のライブラリである keras を使用。このライブラリはすごいね。なんと前回苦しんだプログラムを何も書かなくてよいどころか、いろんなバリエーションをほぼ自動でやってくれる。流れとしてはこんな感じ。画像は縦28横28のピクセルなので、それを全部一列に並べなおしてベクトル化。そのベクトルの要素数値をニューラルネットワーク入力層とする。keras では、Dense と書く中間層・出力層を Sequential に並べる。中間層ではシグモイド関数、または、ReLU 関数を使い、出力層ではソフトマックス関数。誤差はいつものように交差エントロピーなんだけど、確率的勾配法というものが使われる。1回の学習ですべてのデータを使わずに複数回の学習で全データを使うようにし(全データを使ったら1エポック)、これにより改善はヨタヨタ進むこととなる。後半ではフィルター、プーリング、ドロップアウトといった画像認識改善手法が説明される。

その⑤
とうとう終わった。大変だったが、いい本だった。素人でも本書を読めば、機械学習のコンセプトがわかる。深層学習がどういうものかもわかる。Chapter 9 は教師なし学習。まずは K-means 法と、その目的関数である distortion measure。ランダムな初期値から始めて、その初期値を使って計算してみた値をもとに、各係数値を計算してみる、を繰り返し、収束を待つというコンセプト。その次は混合ガウスモデルというものだけどコンセプトは近い。目的関数は交差エントロピー誤差の変形バージョン。すべてのデータに確率重みを付けて計算する。Qiita というサイトのEMアルゴリズム徹底解説というページにより詳しい説明あった。

スポンサーサイト



category: 父の本

cm 0   tb 0   page top

パリの国連で夢を食う。 

pariskokuren.jpg
パリの国連で夢を食う。
パリの国連で夢を食う。

これいいね。30女の青春記といった感じかな。国連職員と言ってもエリート風はまったくなくて、正に自由人。お父さんが自由人で人生を謳歌したというけど、著者だって負けてない。著者の言葉を借りれば、行き当たりばったりでもがむしゃらに、大人の論理なんか無視して、自分の思う道を、自分の足で進んでいる。あとがきで高野秀行の名前がでてきてびっくり。読んでいて何か同じ空気を感じるなーと思ってたんだよね。おすすめ。

category: 父の本

cm 0   tb 0   page top

テレビに映らない北朝鮮 

tvniuturanaikiachousen.jpg
テレビに映らない北朝鮮
テレビに映らない北朝鮮

北朝鮮ウォッチャーである著者が実際に見た北朝鮮。いい本だよ、これは。北朝鮮の実情はいろんなことが新鮮。すぐ育つウサギやウズラを食用に育てる。北朝鮮の高校では物理でミサイルを教える。金正恩による視察は工場経営者たちにとって命がけ。平壌とソウルの間に旅客機が飛ぶこともある。地方の生活レベルの低さ。物資不足。それらを力づくでまとめようとする金正恩。

category: 父の本

cm 0   tb 0   page top

プラットフォーム革命 

platformkakumei.jpg
プラットフォーム革命
プラットフォーム革命

グーグル、アップル、アリババなどプラットフォーム企業は世界を席巻している。プラットフォーム企業は、関連するサービスやモノや情報の流れをプラットフォームに載せ、消費者・ユーザー・企業などをつなげ、取引を円滑化する。ウーバーはわかりやすいプラットフォーム例。ソフトウェアそのものはすぐ模倣されるコモディティに過ぎない。真に価値があるのは、ソフトウェアを使って構築されるユーザー、取引、データのネットワーク。しかしネットワークは質や広げ方も重要であり、大学・SNSでの先行者は他にもいたが、フェイスブックはネットワークを絞って広過ぎないようにして成功した。プラットフォーム企業のコスト構造は既存業者と根本的に異なる。エアBを例にとれば、既存ホテル業者がホテルを所有・賃貸する必要があるのに対し、エアBにその必要はない。正に既存業者・業界の破壊者。既存業者向けだった法律も今後は変わっていくだろうが、プラットフォームに駆逐される業界・会社は今後も増える。いやー、これに早く気づいてビジネスを築き上げた人たちはすごい。

category: 父の本

cm 0   tb 0   page top

北朝鮮がアメリカと戦争する日 

kitachousengaamerika.jpg
北朝鮮がアメリカと戦争する日
北朝鮮がアメリカと戦争する日

結構トランプを評価している。まあオバマは内向きだったもんな。そして北朝鮮核問題の始まりは、アクションをとれなかったクリントンにあるとのこと。難しいところだよな。1994年に北朝鮮を攻撃していれば、韓国(場合によっては日本も)に相当のダメージはあっただろう。今も似たような局面。短期的に戦争を避けても、北朝鮮を非核化できなければ、東アジアのリスクは継続するし、世界の他の国が核を持つ可能性も増えることになる。近視眼的な平和主義は平和につながらない可能性がある。北朝鮮の目的は金王朝の存続であり、国民はどうなったっていい。アメリカの目標は北朝鮮の非核化であり、金王朝の破壊はそこまでの重要度を持たない。ディールも成り立ちうるけど、どこまで北朝鮮の非核化を担保できるんだろうか。

category: 父の本

cm 0   tb 0   page top

ルポ 隠された中国 

隠された中国
ルポ 隠された中国
ルポ 隠された中国

ウイグル動乱などの事件を著者は取材に行くんだけど、近くまで行くと警察に記者であることがばれて、取材できなくなる。著者の努力はわかるけど、この形の報道が難しいことはもうわかってるんじゃないだろうか。巨大中国をたった数人でカバーして、時事ネタを野次馬的に追い、結局取材できないことも多い、という朝日新聞(または他の大手日本マスコミ)の戦略そのものが間違っている気がする。調査報道をやるか、または、大手新聞所属をやめてジャーナリスト独り立ちするか、など検討すべきだと思う。また、中国について書くにも、何らかの専門的切り口が必要。ビジネス、テクノロジー、政治、カネ、武力、民衆、何でもいいけど。

category: 父の本

cm 0   tb 0   page top

間違う力 

matigautikara.jpg
間違う力
間違う力

「ワクワクしながらチャレンジしていくのが人生で、どんな人生が間違っているなんてものはない」という結論は、タイトルを否定してるよね。でも同感。人生は脇道にそれてこそ。

category: 父の本

cm 0   tb 0   page top

地図から消される街 

tizukarakesareru.jpg
地図から消される街
地図から消される街

あれだけの大事故が風化していく。政府・経産省・電力会社は、時の経過と合わせて、できるだけ事故・被害の矮小化をはかる。避難者の困難や、福島第一の処理過程での放射能拡散などは、なかったことにする。東電の賠償債務を減らすために避難者には帰還を促すが、帰還しようにも、家が動物のすみかになってしまっている、住民数が激減して仕事が成り立たない、学校が成り立たないサイズに学生数が減ってしまった、家族の中で帰りたい人と帰りたくない人に分かれてしまう、形だけの除染しかされていない、こどもの被爆リスク、などの問題がある。そんな八方ふさがりの中、自殺者も増えている。後半に出てくる、避難いじめがなかったことにするという学校・教育委員会の対応もひどい(この事件を思い出させる)。

category: 父の本

cm 0   tb 0   page top

インド・シフト 世界のトップ企業はなぜ、「バンガロール」に拠点を置くのか? 

indiashift.jpg
インド・シフト 世界のトップ企業はなぜ、「バンガロール」に拠点を置くのか?
インド・シフト 世界のトップ企業はなぜ、「バンガロール」に拠点を置くのか?

インド・バンガロールは超ダイナミックなんだね。それをガッツリ紹介してくる素晴らしい本。ジュイッシュ頭脳で輝くイスラエル下請け製造拠点からハードウェアのシリコンバレーとなった深圳、オフショアソフトウェア開発拠点から今やシリコンバレーを超えるかもしれないバンガロール。21世紀は理系グローバル人材の戦いだな。特にインドは高度IT人材が質・量ともにすごい。イスラエルは少数超精鋭という感じだけど、インドは質に加えて量がある。日本の理系大卒は毎年10万人なのに、インドの理系大卒が毎年100万人でしかも世界標準語を話せる。インドは超トップクラスがITにいく。日本は医学部に行ってしまう。著者は、日本人より優秀なインド人を雇うことの検討を促している。実際、IBMなんかはアメリカでの従業員数より、インドでの従業員数の方が多い。しかも、そういった会社はゴロゴロあり、IT業界に限らない。優秀なインド人は、論理的思考、討論、専門知識、リーダーシップ、多様性対応が優れていると著者は言う。さらに著者があげる超重要点が「カオスに育てられる」だ。世界はジャングルであり、動物園で育った動物(= 人材)よりも、ジャングルで育った動物に生き残りチャンスがある。

category: 父の本

cm 0   tb 0   page top

日本再興戦略 

nihonsaikousenryaku.jpg
日本再興戦略
日本再興戦略

すごい人のすごい駄作だと思う。才能爆発ではなく、才能と関係ない分野にとっちらかって意味不明。まあスティービーワンダーだって傑作の後に駄作とかあったしね。こういう若者には国なんて概念はぶっとばして、テクノロジー + αでつっぱしってほしい。日本のこととか考えだしたら後退だと思うね。あとがきに書かれている本人のとったアクションはすばらしいと思う。批評家にならずに自らもポジションを取れといい、自分は大学教員職を辞し、自分で資金を集めて大学内に研究所を作り自分で自分の給料を払っているという。

category: 父の本

cm 0   tb 0   page top

訪問者数

カテゴリ

最新記事

最新コメント

最新トラックバック