Going Faraway

渡辺遼遠の雑記帳

書評:『破綻するアメリカ』(会田弘継)

破綻するアメリカ (岩波現代全書)

破綻するアメリカ (岩波現代全書)

アメリカの左右両派の思想的な混乱状況が描き出されており、読んでいる間、部屋の壁が迫ってくるような圧迫感と混乱を感じる本でした。

著者の会田氏は、共同通信の元ワシントン支局長のジャーナリストで、現在は大学でアメリカの社会思想について研究されている方です。前作『トランプ現象とアメリカ保守思想』は、ドナルド・トランプ氏の大統領当選を受けて急いで出版されたジャーナリスティックな本といった趣きで、トランプ現象の保守思想における歴史的な位置付けを、やや荒削りな状態で提示したものだったように記憶しています。トランプ当選から約1年経過後に出版された本書では、イデオロギーによって市民が分断され、政治的に行き詰まったアメリカの政治と社会情勢が詳細に、より広い視野と歴史的な視座から描き出されています。

-- 

2016年の大統領選挙の選挙運動中に、「デキウス」というラテン語ペンネームを使った、匿名の論説がオンラインで発行されました。そのデキウスは、アメリカ市民は「フライト93」の乗客のようなものだと言います。

 2001年9月11日の同時多発テロ事件の際、ユナイテッド航空93便では、乗客が外部と連絡を取り、既に発生した他のテロの情報を得たため、乗客がテロリストに抵抗を試みました。結果、飛行機は墜落してしまったものの4件目のテロは未然に防がれ、乗員乗客以外の犠牲者を出すことはありませんでした。

 デキウスは、今やアメリカ市民は皆フライト93の乗客であるのだと言います。国家の操縦桿はテロリスト同然のエリートに支配されており、このままであれば確実に衝突を迎えることになる。ならば、我々もフライト93の乗客のように抵抗し、ドナルド・トランプを大統領にするために賭けてみるべきではないか、と言うのです。

-- 

ここには、日本社会についてよく言われるような「閉塞感」や「停滞感」といった生温い感情ではなく、より危急な切迫感を伴った絶望があります。背景には、アメリカ社会の強烈なまでの貧富の格差拡大、中年白人男性の死亡率の上昇などの問題が存在しています。黒人やヒスパニックなど差別を受けている民族集団でも死亡率は低下傾向にあるにもかかわらず、白人男性だけは死亡率が上昇しています。 (原因として医療用鎮痛剤の乱用があると言われています)

 アメリカ社会の混沌とした状況を受けて、トランプ現象を引き起こした左右両派の思想的な混乱状態を描き出そうとしているのですが、状況そのものが混乱しているだけにその描写も込み入っており、情報量も多くなかなか難解です。

本当に乱暴にまとめるなら、もともと王政や封建制の歴史を持たないアメリカでは、保守思想が「守り保つ」べき伝統が何であるかは明確ではなく、「何度も建て増しされた温泉旅館」のように、保守思想も複雑な経緯を辿ってきました。直近の右派主流派であったいわゆる「ネオコン」は、イラク戦争の復興の泥沼化により影響力を失いました。一方、左派はソビエト解体後に共産主義の影響力が衰退し、代わって女性、LGBT、被差別民族などのアイデンティティを強調する「アイデンティティポリティクス」が主流となりました。しかし、アイデンティティポリティクスは、社会をまとめるよりは個人を対立させ、むしろ社会をバラバラに解体する力として働くようになってしまいました。「リベラル」を自認する学生が考え方の異なる大学教授を吊るし上げる描写には絶望感を感じますし、このアイデンティティポリティクスの帰結については左派内部からすら批判があります。

 右派左派ともに混沌とした状況にあって理想を語れず、特に経済情勢の変化による中間層への影響を捉えきれていなかったところ、伏流のように流れていたもう一つの右派=オルト・ライトが政治的に無視できない影響を持つようになった、という流れが描き出されています。オルト・ライトは白人至上主義や排外主義と同一視して語られることも多いですが、決してそれだけで語れるものでもありません。一つ興味深かったのは、オルト・ライトの思想的な背景に、西洋の没落・衰退史観があるという指摘です。

 本書は現状分析と思想史に関する本であるため、「将来どうなっていくのか」「今後どうすれば良いのか」といった予測・提言はありません。しかし、私が感じるのは、以前私が紹介したジョン・マイケル・グリアも予測していた通り、左派の側でも巨大な地殻変動が近づいているという予兆です。そしてその変化は、アメリカ国内政治だけではなく、アメリカの対外政策、そして日本の国際関係にも極めて巨大な影響をもたらすのだろうと思います。

【Deep Learning with Python】 IMDBのレビュー分類

フランソワ・ショレ氏の「Deep Learning with Python」のサンプルコードの2つ目。

この問題は、映画のレビューの文章を入力して、そのレビューが肯定的なものか否定的なものかを判定するもの。問題の種類としては二値分類 (binary classification) に属する。データセットは、IMDB (Internet Movie Database) というサイトに投稿された映画のレビュー5万件であり、肯定的レビューと否定的レビューが半数ずつ含まれている。

3.4. 映画レビューの分類

前回のMNISTデータセットと同様、対象のデータセットに対するインターフェースはKerasに付属しているので、それを使ってロードする。こちらも初回実行時はデータをダウンロードするので多少時間を要する。

from keras import models
from keras import layers
from keras.datasets import imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

load_data() 時に指定している引数「num_words」は、レビューの文章中に出現する単語の種類を制限するためのものである。ここでは10000を指定しているので、頻度順の上位10000語のみが使用され、頻度の低い語は「?」(unknown)として表記される。対象データは、単語を数値でエンコードしたリストである。それぞれの数値が、単語の出現頻度における順位を表す。

以下の関数で、エンコードされたレビューを英語の文章へとデコードすることができる。なお、単語のインデックスは3から始まっている。これは、0, 1, 2がそれぞれ、「パディング」、「開始位置」、「不明語」を表すため。

def decode_review(num):
    word_index = imdb.get_word_index()
    reversed_word_index = dict(
        [value, key] for (key, value) in word_index.items())

    decoded_review = ' '.join([reversed_word_index.get(i-3, '?') for i in train_data[num]])
    
    return decoded_review

試しに1件レビューを表示してみる。"one of the worst films…" みたいな表現があるので、当然これは否定的なもの。

? this has to be one of the worst films of the 1990s when my friends i were watching this film being the target audience
it was aimed at we just sat watched the first half an hour with our jaws touching the floor at how bad it really was the rest of the time everyone else in the theatre just started talking to each other leaving or generally crying into their popcorn that they actually paid money they had ? working to watch this feeble excuse for a film it must have looked like a great idea on paper but on film it looks like no one in the film has a clue what is going on crap acting crap costumes i can't get across how ? this is to watch save yourself an hour a bit of your life

前回と同様、入力リストをベクトル化する。1万の要素を持つリストが文章中の単語の個数並んでいるもので、個々のリストは単語の出現頻度中の順位を表す。

# 入力データのベクトル化を行う関数
def vectorized_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, seq in enumerate(sequences):
        results[i, seq] = 1.
    return results

# 訓練データのワンホットベクトル化
x_train = vectorized_sequences(train_data)
x_test  = vectorized_sequences(test_data)

# ラベルの変換
y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')

# 訓練中の正解率を訓練データ以外のデータで評価するため、
# 1万件を訓練データから取り分けておく。
x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]

次に、ニューラルネットのモデル定義を行う。ここでは、入力は10000要素のベクトル、隠れ層が2層。それぞれの隠れ層のノードは16個、出力層は0から1の値を出力する1ノードのニューラルネットとなる。各層間の結合は全て密結合で、訓練は20回行う。modelのcompile関数に、先に分離した訓練データ1万件を与える。

from keras import losses, optimizers
from keras import metrics

model.compile(optimizer=optimizers.RMSprop(lr=0.001),
              loss=losses.binary_crossentropy,
              metrics=['accuracy'])

history = model.fit(partial_x_train, partial_y_train,
                   epochs=20, validation_data=(x_val, y_val),
                   batch_size=512)

訓練を実行し、検証データに対する損失関数の値と予測正解率のモニタリングを行う。ささいなミスではあるけど、書籍に掲載されたコードには誤植があるようだ。p.74で、訓練/検証時の損失関数の値をプロットしているが、x軸の範囲を求める際に、未定義の変数 accを使ってしまっている。

epochs = range(1, len(acc) + 1)
# => 正しくは len(loss_values) もしくは len(val_loss_values)

訓練時の正答率と損失関数の値をプロットしたものがこちら。2回目か3回目以降、悪化している (過学習に陥っている) ことが分かる。

f:id:liaoyuan:20180123225826p:plainf:id:liaoyuan:20180123225833p:plain

さて、訓練済みのモデルを使って、新しいデータに対する予測を行う。ここではmodelのpredict関数を使う。

model.predict(x_test)
array([[ 0.98006207]
       [ 0.99758697]
       [ 0.99975556]
       ...,
       [ 0.82167041]
       [ 0.02885115]
       [ 0.65371346]], dtype=float32)

元のデータセットにおいて、「1」が肯定的意見を、「0」が否定的意見を表す。出力も、1あるいは0に近ければ近いほど確信度の高さを表し、中間の0.5に近い値はどちらか判断できないことを表す。

更なる実験

モデルのレイヤー数、ノード数を変えてみたり、損失関数や活性化関数を変えて、結果の変化を確認してみましょう、という演習がある。ここでは、レイヤー数を増減させて学習し、テストデータに対する予測正解率がどう変化するかを見てみた。

上記のサンプルでは隠れ層が2層のモデルを使用したので、隠れ層が1層と3層のモデルを用いてみる。コードは省略するが結果は以下の通り。

f:id:liaoyuan:20180123225045p:plain

レイヤー数を増やすほど精度は向上する傾向があるわけではなく、むしろ1層のモデルの方が正答率は高い。深けりゃ良いってものでもなく、ナイーブな方法でパラメータを増やせば過学習が起こりやすくなるのだろうと思う。

今回は以上。ちなみに、次のサンプルプログラムである「ニュース記事のカテゴリ分類」は飛ばして、ボストンの住宅価格予測の回帰問題を取り上げる予定。

読書メモ:Deep Learning with Pythonを読む

以前、軽く流し読んだフランソワ・ショレ氏の「Deep Learning with Python」ですが、ちゃんとサンプルを動かしながら勉強していこうと思います。

なお、この記事は機械学習素人が勉強の過程をメモするためのであり、内容の正しさについては保証しません。(ちゃんと知りたい人は上掲書を読みましょう)

2.1. はじめてのニューラルネット

最初は機械学習のサンプルとしてよくあるMNISTの分類を行う。MNISTは、0〜9までの手書き文字の画像で、訓練データが6万件、テストデータが1万件存在する。
f:id:liaoyuan:20180118211402p:plain
図:MNISTのサンプル

なお、MNISTのデータセットへのインターフェイスはKeras自体に付属しているので、以下のコードでデータセットを読み込める。(初回ロード時にはデータをダウンロードしに行くので、多少時間が必要。)

from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
original_test_labels = test_labels
original_test_images = test_images

ニューラルネットにこのデータを入力して学習させる前に、まずはニューラルネット(tensorflow) が受け付けられる形式にデータを整形する必要がある。

train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

MNISTのデータは28x28ピクセルを表現した二次元配列であり、各ピクセルは0〜255 (グレースケール) の値を取る。各データを一次元の配列で0〜1までの実数(浮動小数点数) に変更する

データのラベルは0〜9までの整数で表現されているので、ワンホットベクトル形式に変更する。ワンホットベクトルとは、以下の形式の表現。

0 => [1,0,0,0,0,0,0,0,0,0] 
1 => [0,1,0,0,0,0,0,0,0,0]
2 => [0,0,1,0,0,0,0,0,0,0]
# 10個の要素を持つリストで、数字の「2」であれば3番目の要素だけが1で他は0

この変換をしてくれるkerasの関数がある。(keras.utils.to_categorical)

カテゴリをワンホットベクトル形式で表現する必要性については、このサイトの説明が分かりやすかった。(多分、線形演算でカテゴリの分類を扱うための技法ということらしい。) この程度の変換は良きにはからって勝手にやってくれと思わんでもない。

ニューラルネットのモデル定義

次から、ニューラルネットのモデルを定義する。

models.Sequencial は、その名の通り「順番に」 ニューラルネットの層を重ねるモデルである。Dense というレイヤーは、密結合(全結合)ネットワークで、前のノードとの間に全てエッジが引かれる。最初の引数はその層のノード数を表し、activationは活性関数を表す。

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

最初はニューラルネットのモデルがあまり分からなかったので図にしてみた。こんな感じだと思われる。

f:id:liaoyuan:20180118212624p:plain

Layerはその名の通り「層」を表すものだけど、むしろ層と層を繋ぐ方法を指定するものだとイメージしたほうが分かりやすいかもしれない。

学習させる前に、compile関数でモデルの準備を行う。このとき、最適化関数、損失関数、メトリクスを定義する。それぞれの役割と詳細はここでは省略する。

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])

学習実行

訓練データに対して、学習を10回実行する。epochsで訓練回数を指定。batch_size は訓練バッチのサイズを指定するもので、ここで指定したサンプル数ごとに勾配の更新を行う。今回はCPUのみで学習を実行したが、この程度であれば数分もかからず学習が完了した。

network.fit(train_images, train_labels, epochs=10, batch_size=128)

そして、evaluate関数でテストデータを用いて訓練したモデルを評価する。テストデータに対する正答率は97.9%くらい。

test_loss, test_acc = network.evaluate(test_images, test_labels)
print(test_acc) # => 0.9793

 

予測と結果の表示

書籍のサンプルとしてはここまでだけど、単に学習させるだけで終わっても面白くないので、簡単に結果を確認してみたい。

まずは結果概要を確認するために混同行列を表示する。縦の列が本来の値で、横の行がニューラルネットによる推測値である。対角線上の値が正解数を意味する。

[[ 970    1    0    1    1    0    4    1    2    0]
 [   0 1123    4    1    0    1    3    1    2    0]
 [   1    0 1013    1    2    0    3    7    5    0]
 [   0    0    4  990    0    4    2    3    3    4]
 [   0    0    2    0  964    0    8    2    0    6]
 [   2    0    0    7    0  874    5    1    1    2]
 [   3    2    1    1    1    2  948    0    0    0]
 [   1    3    9    1    0    0    0 1003    3    8]
 [   1    0    3    3    3    2    2    2  953    5]
 [   0    2    0    1    8    3    1    5    3  986]]

厳密に統計的な分析をしたわけではないけど、6, 8, 9などの丸を含む数字は苦手なのだろうか、という印象。

更に、誤った予測をされた数字の画像を出力させたいので、テストデータに対して予測を行う。ここで使うのは predict_classes メソッドで、テストイメージのNumpy配列を受け取り、クラス(カテゴリ)の予測結果、つまり0〜9の値が入った配列を返す。

predicted_classes = network.predict_classes(test_images)

ニューラルネットの予測のうち、誤答だったものを画像で100件出力してみる。左上の青文字が正解のラベルで、赤字がニューラルネットの予測値 (誤答)

f:id:liaoyuan:20180118214029p:plain

0と6の混同など、文字が乱雑すぎて人間でも同じ間違いをするだろうという感じの文字もあるし、2と8のように何故こんな不可解な間違いをするんだっていう予測もある。今回は2次元の画像データを1次元のベクトルに変換しており、縦方向の形状を活用できる処理をしていないからこうなるのでしょう。(ちなみに、本書ではCNNは5章で扱われる予定)

一応今回のコードは以下のgistに掲載した。
"Deep Learning with Python" のMNISTサンプル · GitHub

今回は以上です。

「危険な年」 ジョン・マイケル・グリアの2018年予測

ジョン・マイケル・グリアの2018年予測が面白かったのでメモしておきます。グリアは、米国の「ドルイド教」という古代ケルトの信仰の復興を目指すネオペイガニズムの宗教家ですが、極めて特異な視点を持った博学な歴史家としての一面があり、種々の文明批評的な著作があります。

グリアは、2016年1月に、未だスーパーチューズデー以前の段階で、2016年11月にドナルド・トランプが大統領選挙に当選することを予測していました。そのため、私は彼の予測に非常に信頼を置いています。また、米国のさして高い地位に居るわけではない市井の人の視点からの合衆国政治ウォッチとして、非常に興味深い予測であると考えるのでここで紹介します。

予測手法

…my method in making these predictions is at once simple, effective, and highly unpopular.  Put briefly, I pay attention to what happened when the same conditions occurred in previous historical epochs, and predict that the same consequences are going to follow.

(私訳) 私の予測手法は、一見シンプルで、効果的で、非常に不人気なものだ。簡潔に言えば、過去の歴史時代において同様の状況が発生したときに何が起きたのかに注意を払い、そして、同様の結果を生むと予測するものである。

人類には既に5000年もの歴史があり、また近年の人々は歴史の教えが自分自身に適用できると考えておらず歴史を軽視しており、結果的に歴史的事例と同じ状況に陥ることが多いので、この方法が有効であるのだと言います。

総合的予測

Some historical epochs are more dangerous than others, and the most dangerous of all are those in which a once-great empire is on the way toward history’s dustbin.

(私訳) いくつかの歴史時代には、他よりも危険な時代が存在する。そして、最も危険な時代は、かつての大帝国が歴史のゴミ箱へと向かう道程である。

  •  アメリカが超大国としての地位から落ちていくことが、米国の国内政治と国際情勢を形成する
  • これまで、誰も予測していなかったような「ブラックスワン」的事象が発生する

米国の国内政治

  • トランプ政権は、過去の大統領たちと同様の方法を取り、それに成功している
    すなわち、自身に敵対する人々を犠牲にして、自身の支持者にエサを与えることである
  • 民主党は、2016年の大統領選挙の敗北から教訓を学ぶことに失敗している
    ゆえに、2018年の中間選挙、2020年の次期大統領選挙でも共和党が勝つ見込みが高いと見ている
  • ただし、ここにもブラックスワンが存在する

While you’re watching domestic US politics, by the way, keep an eye out for a massive sea change that’s under way this year, though it probably won’t have an impact for a few years yet: the absurdity of Christians in America supporting a political agenda that directly contradicts the teachings of Christ has begun to sink in, in a big way, among young American Protestants.

(私訳) アメリカ国内政治を見る時には、今年進行する巨大な潮流の変化に眼を向けてほしい。しかし、この影響が明らかになるまでにはまだ数年を要するだろう:アメリカのキリスト教徒は、キリストの教えと真っ向から矛盾する [共和党の] 政治的アジェンダを支持することの馬鹿さ加減に気付き初めている。とりわけ、若いアメリカのプロテスタントにおいて。

Donald Trump, interestingly enough, seems to have been the bright orange straw that broke this particular camel’s back; a great many young evangelical Christians, watching their elders turn cheerleader for a man who’s a poster child for every one of the seven deadly sins, have had enough.

(私訳) ドナルド・トランプは、興味深いことに、ラクダの背骨を折る最後の藁であったようだ。極めて多くの若い福音派クリスチャンは、老人たちが7つの大罪の全てを体現したような男の支援者となったのを見て、もう十分だと考えている。

  •  米民主党は、未だこの状況を活用することができていないが、数年以内に巨大な地殻変動が起きる可能性がある
  • それは、大西洋を挟んで英労働党ジェレミー・コービンが行なっていることと似た事象である
    すなわち、与党のクローンと化す以前の、政党の元の姿を取り戻すことである
  • これが2020年以前に発生すれば、次期大統領選挙において「左派福音派」が巨大な勢力となるだろう
    もし2020年に民主党が敗北することがあれば、その後に左派福音派の勃興が起こるはずだ

国際情勢

  • 前述の通り、アメリカの衰退が国際情勢を形成する
  • シリア、エジプト、トルコなど中東諸国でロシアの影響力が強まりつつあり、この傾向は続くだろう
  • 小国が地域的野心を抱き、局所的な紛争が発生する可能性はあるが、ロシア、中国、イランなどアメリカと対峙する国家との間での大規模な衝突は決して起こらないだろう
    彼らは、ただアメリカの衰退を待っていれば良いのだから
  • 国際情勢について議論する際には、特にサウジアラビアに注目するべきだ
  • 絶対王政国家が、経済改革を実行しなおも権力の座に留まり続けることは、極めて危険な政策である
    それは、フランスのルイ16世が1789年までに、1917年以前の何年もの間にロシアのニコライ皇帝が、1978年以前の数十年間にイランのシャーが試みたことであるが、サウジアラビアムハンマド・ビン・サルマーン皇太子は同じ政策を取っている

経済

  •  株高や仮想通貨の価格上昇は、続くかもしれないし続かないかもしれない
  • 「幻想の経済」が重力の法則に従うという理由はない
  • 注目するべきトレンドは、バブルではなく「官製経済」 と現実の経済問題との乖離である
What we’re seeing, in other words, is the transformation of the US economy into a Potemkin Village capitalism in which government largesse backed by Ponzi financing props up a thin imitation of prosperity over the top of spreading impoverishment. It’s not accidental that Elon Musk, one of the most highly touted of the new generation of capitalist grandees, runs all his businesses on government subsidies.

 つまりは、我々が眼にしているのは、アメリカ経済のポチョムキン村資本主義への変貌である。ネズミ講ファイナンスに裏付けられた政府の下賜金が、貧困の拡大を代償として繁栄の薄っぺらい模倣を支えている。新世代の資本主義の大公として最も賞賛されているイーロン・マスクが、全ての事業を政府補助金に頼っていることは、偶然ではない。 

環境問題

  • 環境問題は重大な問題ではあるが、実効性のある対策は (これまで通り) 何も取られないだろう (この主張は、例年通りの彼の予測)

Windows10でKeras/tensorflowがGPUを使用できない場合のチェックポイント

Deep Learningの勉強をしようと考えて、GPU搭載のマシンを購入して環境構築した際、多少ハマったのでメモを残しておく。とある事情によりWindowsを使いたいのと、Windows+Linuxデュアルブートにはあまり良い思い出がないので、Windows上で環境を構築した。

実行環境

2017年12月現在の環境構築ポイント

  • Windows環境の最新のcuDNNはCUDA 9.0に対応していないため、8.0をインストールする
  • CUDA 8.0のインストールには、Visual Studio 2015のVisual C++とWindows10 SDKが必要
  • Python側は、Anacondaを使ってちゃんと仮想環境を切ればあまりハマるポイントは無いと思われる

環境構築
Visual Studio 2015のインストール

https://my.visualstudio.com/downloads (要ユーザ登録)

次のCUDA Toolkit 8.0のインストールのために必要。CUDA のバージョンはVSのバージョンと密接に結びついているらしく、現行のCUDA 8.0はVS2017に対応していないため、2015を使用する必要がある。Visual C++Windows 10 SDKが必要らしいのでチェックを入れてインストールする。

CUDA Toolkit 8.0 のインストール

CUDA Toolkit 8.0 - Feb 2017 | NVIDIA Developer

CUDA Toolkit 8.0 - Feb 2017 を選択しインストールする。なお、前項のVisual Studio 2015が無くてもインストーラ自体は問題なく完了してしまうが、tensorflow-gpuがうまく動かないという問題がある。(私はこれでハマった)

f:id:liaoyuan:20171229234527j:plain

上記の画面が表示されたらVSのインストールがうまくいっていないので、そのまま進まずにVSのインストールからやり直し。

cuDNNのインストール

https://developer.nvidia.com/rdp/cudnn-download (要ユーザ登録)

cuDNN v6.0 (April 27, 2017), for CUDA 8.0を選択し、zipファイルをダウンロードする。ファイルを解凍すると、cuda/bin,include,libフォルダが展開されるので、CUDAのインストールフォルダ C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 以下のフォルダを上書きコピーする。(もしくは、任意の場所に配置してパスを通す)

Anaconda 5.0 (Python3.6) のインストール

Downloads | Anaconda

Anaconda Python 3.6 versionをダウンロードしてインストール。特に注意点はなし。

Python環境構築

今回は問題が起こらなかったけど、numpyのインストールに失敗したりバージョン不整合が起こるケースがあるらしいので、ちゃんと仮想環境を切ってインストールしたほうが良さそう。Anaconda Promptを起動して仮想環境dlを作成する。

conda create -n dl 

コマンドで仮想環境に入る。

activate dl

以下のコマンドで、必要なpythonのパッケージをインストールする。

conda install -n dl tensorflow-gpu
conda install -n dl keras

今回の環境では、なぜかAnaconda デフォルトのjupyterではpython kernelの切り替えができなかったので、仮想環境側にもjupyterをインストールした。

conda install -n dl jupyter 

最後に、jupyterのnotebookを起動してkerasをimport。
"Using TensorFlow backend." と表示されることを確認する。

import tensorflow
print(tensorflow.test.is_built_with_cuda())

True であれば、tensorflowのインストールは問題なく完了してGPUが使用できるはず。

トラブルシュート時のチェックポイント

CUDA Toolkit

CUDA Toolkitのインストール後、コマンドプロンプトから以下のコマンドを実行する。(nvccはnVidia製のGPU用のコンパイラ)

> nvcc
"nvcc fatal : No input files specified; use option --help for more information"

と表示されれば、CUDAのインストールには問題がないと思われる。nvccを認識できなければCUDAのインストールに失敗している。

cuDNN

tensorflow 1.3以降のバージョンでは、cuDNN 6 (cudnn64_6.dll) が必要となる。cuDNNがロードできないと怒られる場合は、cuDNNのインストールに失敗している (もしくはパスが通っていない) と考えられる。

tensorflowインストールチェックスクリプト

TensorFlow on Windows self-check · GitHub

Windowsでtensorflow構築時の問題切り分けに有用なスクリプトを発見したので共有しておく。VSのライブラリ、cuDNN、CUDA Toolkitのインストール状況と、tensorflowがCUDAを認識しているかを確認してくれる。

動作確認

keras付属のMNISTのサンプルを動作させて、GPUで計算されることを確認した。

f:id:liaoyuan:20171229235314j:plain

所感

やっぱりGPUは爆速で良い。(ちゃんと計測してないけど、CPUのみと比較して10〜20倍くらい速いと思う)

一番面倒くさいのはMicrosoftNVIDIAの開発者アカウント登録だった。

参考

Windows10:KerasでGPUを使用する環境構築のTip's(TensorFlow) - Qiita

[Python]Windows10にTensorflow-GPU+Kerasをインストールする[2017/10/5] - Qiita

はてなブログでAmazon商品を貼り付けると空行が入ってしまう

はてなブログの問題について書きます。私も解決方法が分からなかったので、誰か解決策をご存知であれば教えてください。

 

f:id:liaoyuan:20170829182138p:plain

 

はてなブログの「見たまま編集モード」から、Amazonの商品を「詳細」形式で貼り付けると、上記のスクリーンショットの通り、商品の下に空行が入ってしまいます。見た目の問題だけで、特に実害は無いのですが微妙に気になります。

記事の投稿前には編集できず、投稿後に改めて記事を編集して空行を削除すれば良いのですが一手間が増えてしまいます。

 

あまり有用性の無いエントリですが、とりあえず微妙に不便だなぁと感じているということを書き残しておきます。

『The Master Algorithm』Pedro Domingos の読書メモ

今読書中のこの本ですが、理解を進めるためにも読書メモを書いておきます。

The Master Algorithm: How the Quest for the Ultimate Learning Machine Will Remake Our World

The Master Algorithm: How the Quest for the Ultimate Learning Machine Will Remake Our World

 

著者のペドロ・ドミンゴス氏は、ワシントン大学教授の機械学習人工知能研究で長いキャリアを持つ研究者です。本書は、機械学習における大きな目標となる「マスターアルゴリズム」というコンセプトを打ち出し、その目標を達成するための道程として、既存の機械学習アルゴリズムの歴史と意味を、俯瞰的な視点から描き出した本です。

 

機械学習には、歴史的経緯も存在してさまざまなアルゴリズムがあります。それぞれのアルゴリズムは、固有の領域においてデータから知識を得ることができますが、さらにそれを拡張・統合し、いろいろなデータから帰納的に知識を得られる汎用的な学習アルゴリズム、「マスターアルゴリズム」を作ることができるはずだ、と著者は主張しています。「マスターアルゴリズム」の存在は、原理的に不可能ことではなく、人間の脳はまさに汎用的な学習をしており、それと同様のことはできるはずだ、と言うのです。

実際に、著者はいくつか「マスターアルゴリズム」が存在しうるという傍証を挙げています。個人的に興味深く感じたのは、生後間もないフェレットの視神経と聴覚神経を入れ替え、視神経を聴覚野に、聴覚神経を視覚野に繋ぎ替えても、フェレットは正常な視覚と聴覚を得ることができる、という実験の事例です。このことから、生物の脳は個別の機能に特化しているわけではなく、ある程度汎用的な学習機能を元にして、後生的に知覚情報の処理を学んでいるということが分かります。チューリングマシンが「演繹」ができる万能機械であるように、帰納的な学習のための万能機械である「マスターアルゴリズム」の作成は不可能ではないはずです。

 

そして、「マスターアルゴリズム」という大目標を描き出した後で、そのマスターアルゴリズムの候補あるいは構成要素となる可能性がある、既存の機械学習アルゴリズムを説明しています。ここで著者は、既存の機械学習アルゴリズムを5つの流派に分類しています。

  • symbolist シンボリスト (記号主義者)
  • connectionist コネクショニスト(ニューラルネットワーク主義者)
  • evolutionary 進化主義者
  • Bayesian ベイズ主義者
  • analogizer アナロジー主義者

f:id:liaoyuan:20170826175510p:plain

図:5つの学習アルゴリズムにおける知識の表現方法、評価法、最適化手法を表す

 

まず、3章の前半部では機械学習における「学習」とは何であるかを説明しています。デイヴィッド・ヒューム帰納法に対する懐疑論、あるいはその数学的表現である「ノーフリーランチ定理」(可能なありうる全ての状況において、他のアルゴリズムの性能を凌駕するアルゴリズムは存在しえない) を説明しています。機械学習とは「過去のデータを元にして未来の (まだ見ぬ) データを予測する」ものです。これはつまり、汎化誤差 (generalization error) を小さくすることを目的としますが、未来の (未入力の) データはそもそも存在しないため、工学的には不良設定問題 (解が複数存在しうる問題) となります。しかし、これは「機械学習は不可能である」ということを述べているわけではなく、学習には偏見 (バイアス)、あるいは問題に対する前提知識や条件が必要となるということを意味しています。そして、過去のあらゆるデータを記録でき、過去のデータを説明できるだけでは不十分であり、学習にはある程度の一般化が必要となります。(そうでなければ過学習 (overfitting) に陥ってしまいます)

 

3章の後半部分は、シンボリスト (記号主義者) に関しての説明です。シンボリストは、知能を記号操作として捉える流派です。この流派のアルゴリズムとしては決定木の学習が挙げられます。決定木は広範に応用されているアルゴリズムであり、例えばしばらく前に話題になったアキネーター (「20の質問」と呼ばれるゲーム) や電話の自動応答の選択肢などがあります。

シンボリストのアプローチは、シンプルで人間にとっても分かりやすいものですが、欠点としては、確率的なグレーゾーンが存在する問題 (メールがスパムであるか? 病気の症状からあり得る原因を推定し診断する、など) がうまく扱えないこと、扱うべき知識が増えると機能しないこと (知識獲得のボトルネック knowledge acquisition bottleneck) がなどがあります。

 

4章は、近年大きく注目を集めているコネクショニスト(ニューラルネットワーク) に関する話題です。脳のニューロンシナプス結合に着想を得たパーセプトロンのモデルは、1950年代に開発されました。マーヴィン・ミンスキーが、1層パーセプトロン排他的論理和 (XOR) など線形分離不可能な問題を学習できないことを指摘し、一時期注目が低下しました。パーセプトロンの層を重ねることにより、この問題が解決できることは知られていましたが、重なった層 (隠れ層) で効率的に学習をすることが不可能だったのです。バックプロパゲーション (誤差逆伝播、バックプロップ) やオートエンコーダなどの手法により、隠れ層でも効率的な学習ができるようになったことが、今日のディープラーニングの隆盛の裏にあります。ちなみに、バックプロパゲーションは、複数の研究者によって何度か独立に発見・発表されており、日本では、計算神経科学者の甘利俊一氏が類似のアルゴリズムを発見していたと言われています。
近年のディープラーニングの成功を見ても分かる通り、コネクショニズムは強力な方法ですが、欠点もあります。シンボリストであれば簡単に扱える論理的な判断、構成的 (compositional) な概念を扱えないこと、ニューラルネット内部の判断が人間に理解できないことです。

 

5章では、「遺伝」あるいは「進化」の考え方を取り入れたアルゴリズムを取り上げています。

(以下続く。随時更新予定)