越境するコンピューター

越境するコンピューター

新しいコンピューターとの付き合い方 〜コンピューターと意思決定と人間〜

ゼロから始める機械学習 〜悩めるシステムエンジニアの方に向け連載開始〜

 

qiita.com

qiita.com

 

長年IT業界に身を置くシステムエンジニアにとっても機械学習って結構ハードルが高いです。

「入門書を手に取ったけど数ページ進んで数式が出てきたところでギブアップ」

という方も多いのではないでしょうか?

「学生時代に理系専攻で数学をバリバリやってた」という人なら話は別ですが「学生時代文科系だったけどIT業界に入ってシステムエンジニアやってます」という方にとっては巷に出ている「機械学習入門書」はかなりハードルが高いと思います。

でも勘違いしないでください、あなたが理解できないのはあなたの頭が悪いからではありません、あなたが理解するための前提知識を身につけていないだけなんです。

連続ドラマに例えると、5話目からから観るとストーリーわかりませんよね、それは1〜4話のストーリーを知らないからですよね。

機械学習も同じこと、巷の「機械学習入門」はある程度の数学の知識(線形代数微分積分、統計など)を前提にして書かれているものがほとんどです。この前提知識を身につければ機械学習のハードルはぐっと下がります。

「でも前提知識って数学なんでしょ?学生時代数学苦手だったから私には無理かも」と思っているあなた、安心してください、絶対大丈夫です。

数学の知識といっても決して難しいものではありません。少なくともシステムエンジニアとして仕事をしているあなたなら、慣れてしまえば「なんだ、こんな簡単なことなのか」と思える日が必ず来ます。

機械学習に必要な前提知識を身につけるのに、重要なポイントが二つあります

  • 何の役に立つのかを理解する
  • 数式に慣れる
何の役に立つのかを理解する

機械学習に必要な数学の前提知識(線形代数微分積分、統計など)のわかりやすい入門書は沢山あります。機械学習に必要だからという理由でこれらの入門書で勉強を始めた人が挫折する大きな理由として「機械学習にどう役立つか分からんのでやる気が出ない」というのがあると思います。目的がわからないまま基礎練習ばっかりやらされてる感じが、時間の無い多忙なシステムエンジニアには厳しいですよね。

まず「機械学習でこう言う風に使われるから必要なんだ」と理解してから勉強すると、目標が見えるのでやる気が出ますし、実践的な理解が可能になります。

数式に慣れる

「数式を一つ追加すると本の売り上げが半分に落ちる」という話がまことしやかに囁かれるほど、数学に馴染みのない人にとって数式はハードルが高いようです。

しかしシステムエンジニアのあなたはこれまでの仕事でプログラムを書いたり読んだり、システム設定のパラメーターを調整したりしたことがあると思います。

数式も一つのプログラム言語のようなものです、慣れるまでは何を言いたいのか読み解くのに時間がかかりますが、慣れてしまえば「確かに、文書で書くよりシンプルでわかりやすい」と思えるようになります。

プログラム言語を習得した時のことを思い出しましょう。システムエンジニアなら必ず数式を楽に読み解けるようになります。

ゼロから始める機械学習

筆者はAIのコミュニティーを立ち上げ活動を行っており、その活動の一つとして機械学習入門をコミュニティーメンバーと実施しています。

この活動をする中で「数学の前提知識を持たないシステムエンジニアの方は多い、そんな方たちが機械学習の知識をスムーズに身につける手助けができれば」との思いを持ち、連載を開始することを思い立ちました。

「前提知識ゼロの方にも理解できるわかりやすい内容にすること」「分かりやすさのために正確性を犠牲にしないこと」を目標に、コミュニティー活動を通じて得たフィードバックを織り交ぜながら進めていきます。

記事はQiitaに投稿していきます、こちらに投稿したリンクを添付していきますので、よろしくお願いいたします。

 

 

 

 

 

劇的精度向上で話題のディープラーニングを使った翻訳の仕組み

ちょっと前までコンピューター翻訳って「なんとか理解できるけど、かなりぎこちない」という印象でしたが、最近は驚くほど流暢な翻訳をしてくれます。この劇的と言える品質の向上、実はディープラーニングによって実現されています。

今日は、ここ数年でコンテストや実際の活用場面で従来の方法を上回る結果を出して注目を浴びている "ニューラル翻訳"と呼ばれるディープラーニングを使った仕組みについて記してみたいと思います。

ニューラル翻訳による機械翻訳

ニューラル翻訳による機械翻訳和文英訳を例に説明します。

1.ざっくりどんな仕組みか?

大量の日本文と英訳文のセットを使ってニューラル翻訳に対する学習を行います。適切な学習をさせた後日本文を入れると、翻訳された英文が出てくるようになります。

以下では学習が完了したニューラル翻訳で和文英訳を行う際の動きを使って、その仕組みを説明します。

2.ニューラル翻訳への入力前の下準備

2-1.単語分割

ニューラル翻訳への入力は単語単位になりますので、まず文書を単語分割する必要があります。英語の場合単語の間にスペースあるので比較的簡単ですが日本語は単語の切れ目が無いので少し難易度は高いです。形態素解析と呼ばれる単語分割の方法を使ってこれを行います。今回は形態素解析については詳細を記しません「単語を分割する仕組みがあるんだ、それをやってくれる仕組みがあるんだ」と理解いただければ大丈夫です。

  • 今日はいい天気ですね → '今日' , 'は' , 'いい' , '天気' , 'です'

2-2.one-hotベクトル

コンピューター扱えるのは基本的に数値データのみですから入力に先立ち、単語を数値情報に変換する必要があります。単語の数値変換に使われるがOne-Hotベクトルです。語彙数分の次元を持つベクトルを準備し、単語に割り当てられた要素のみを1で他は0に設定することで単語を表現します。難しそうに聞こえますがやってることはシンプルです。

'今日' , 'は' , 'いい' , '天気' , 'です' をone-hotベクトルで表現してみましょう。

  • ‘今日’ → 1 (1,0,0,0,0)
  • ‘は’  → 2 (0,1,0,0,0) 
  • ‘いい’ → 3 (0,0,1,0,0)
  • ‘天気’ → 4 (0,0,0,1,0) 
  • ‘です’ → 5 (0,0,0,0,1)

ここでは簡単のため5次元にしましたが、実際は日本語の語彙はもっともっとたくさんあるのでベクトルはもっと高次元(例えば10万)になります。

 *ベクトルというと難しいそうですが、要するにこういうふうにいくつかの数字を並べてセットにしたものです。上の例では5つの数字がならんでるので5次元ベクトルといいます。
 

2.ニューラル翻訳の内部構造

ニューラル翻訳は大きく2つのパートに分かれています。前半パートでは入力された日本文の情報をベクトルに詰め込む作業を行います。後半パートでは作成した日本語ベクトルを元に英文を出力する作業を行います。

2-1.前半パート(日本語情報を符号化する)

ここでは入力された日本語情報を表現するベクトルが作成されます。このパートは2つの層で構成されています、それぞれの層を見ていきましょう。

(1)単語を符号化する(符号化埋め込み層)

ニューラル翻訳の最初の層です。この層では入力されたone-hotベクトルを分散表現ベクトルに変換します。

one-hotベクトルは通し番号振ってるだけに等しいので単語と単語の類似性とか関連性などを表現できません。そこでこの層で入力のOne-Hotベクトルを、複数のベクトル要素で単語を表現する分散表現ベクトルと呼ばれるものに変換します。学習を通じて分散表現が適切な値に設定されれば、意味の似た単語は似た分散ベクトルの値というように単語の関連性を表現できるようになります。

下記の例では5次元のOne-Hotベクトルを3次元の分散表現に変換しています

  • ‘今日’→ 1 (1,0,0,0,0)  分散表現 (0.3, 0,4, 0,5)
  • ‘は’→     2 (0,1,0,0,0)  分散表現 (0.2, 0,8, 0,3)
  • ‘いい’→ 3 (0,0,1,0,0)  分散表現 (2.0, 0.6, 3.0)
  • ‘天気’→ 4 (0,0,0,1,0)  分散表現 (0.6, 3.2, 5.0)
  • ‘です’→ 5 (0,0,0,0,1)  分散表現 (1.3, 4.5, 0.4)

one-hotベクトルは5次元のベクトルのうち1つだけ1で他は0でした。一方分散表現では3次元のベクトルの複数のベクトル要素に値がセットされ単語を表現しています。複数のベクトル要素で表現しているので分散表現と呼ばれます。

(2)日本文を符号化する( 符号化再帰層)

前の層で分散表現に変換された単語を順番に入力して、日本語の文書のベクトルを作成します。この層は作成されたベクトル情報を次のステップで入力として使う再帰ニューラルネットワークという仕組みになっています。

例を使ってみてみましょう。

  • Step#1 ‘今日’                                 → 日本文ベクトル#1
  • Step#2 ‘は’  + 日本文ベクトル#1     → 日本文ベクトル#2 
  • Step#3 ‘いい’ + 日本文ベクトル#2     → 日本文ベクトル#3
  • Step#4 ‘天気’ + 日本文ベクトル#3     → 日本文ベクトル#4
  • Step#5 ‘です’ + 日本文ベクトル#4     → 日本文ベクトル#5 

再帰構造になっているので、各ステップで前のステップで作成された日本文ベクトルを入力として使っています。この層の処理が完了し、最終的に作成された日本文ベクトル#5には日本文を構成する全ての単語情報が入っています。

2-2.後半パート(英訳を行う)

ここでは符号化層で作成された日本語情報を表現するベクトルを元に英訳文を出力します。

  • Step#1 日本文ベクトル#5 + BOS     → 英訳ベクトル#1 →  "It"
  • Step#2 英訳ベクトル#1    + "It"        → 英訳ベクトル#2 →  "is"
  • Step#3 英訳ベクトル#2    + "is"       → 英訳ベクトル#3 →  "fine"
  • Step#4 英訳ベクトル#3    + "fine"    → 英訳ベクトル#4 →  "today"
  • Step#5 英訳ベクトル#4    + "today" → 英訳ベクトル#5 →  "EOS" 

各ステップの動きをみてみましょう。

Step#1では

前半パートで作成した "日本語ベクトル#5" とこれから英文開始しますという特殊文字記号 "BOS" を入力に変換処理を行い、"英訳ベクトル#1"が作成されます。

作成された"英訳ベクトル#1"を入力に変換処理を行い、英訳文の最初の単語 "It" が作成されます。

Step#2では

Step#1で作成された"英語ベクトル#1"と出力された英単語 "It"を入力に"英訳ベクトル#2"が作成されます。

作成された"英訳ベクトル#2"を入力に変換処理を行い、英訳文の2番目の単語 "is" が作成されます。

この後同じように処理を繰り返して行き、"EOS:(End of Sentence)"が出力されたら終了します。

今までの仕組みとの違いと可能性

従来の機械翻訳の仕組みは自然言語処理に必要な色々な部品を組み合わせて作られていました。実装に当たってはまずそれぞれの部品の学習を行い、学習済みの部品を組み合わせたものに対して翻訳の学習を行うという作業が必要でした。

ニューラル翻訳は一つのニューラルネットで翻訳を行うので、従来の方法に比べると学習方法がシンプルです。従来の仕組みの場合は各部品の学習のために部品の学習に特化したデータを作成する必要がありましたが、ニューラル翻訳の場合は実際の翻訳データだけあれば良いのでデータ収集も簡単です。

また従来の部品による構成だとある程度入力と出力の関係を考慮して部品の構成を考えて実装する必要がありましたが、ニューラル翻訳の場合はそういった中間層を考慮する必要がありません。

これを応用すればこれまで入力と出力の関係の定義が難しいため機械学習の対象にすることができなかったような処理も可能になります。この系列変換モデルという仕組みを使って画像情報を入力にその説明文を出力するような学習も実装され始めています。

 

参考書籍 

深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

深層学習による自然言語処理 (機械学習プロフェッショナルシリーズ)

 

 

岩波データサイエンス Vol.2

岩波データサイエンス Vol.2

 

 

統計的自然言語処理の基礎

統計的自然言語処理の基礎

 

 

文系のための人工知能 人工知能をめぐる都市伝説 〜なぜ誤解は生まれるのか?~〜

文系のための人工知能の連載はこちらに引っ越しました。

blogs.itmedia.co.jp

Hatenaブログでは引き続き日々の由無し事を綴っていきますのでよろしくお願いします。

文系のための人工知能 〜今現在、人工知能が出来ることをざっくり理解しよう〜

世に溢れる人工知能の情報は、"今できること" と "SFの世界" と "将来の展望" がごっちゃに語られてるケースが多く、文系の人の多くが人工知能を誤解してしまいます。私もそうでした。 

まず  "今人工知能が出来ること” を理解しましょう。これで少し視界がすっきりすると思います。

人工知能が出来ること

人工知能ブームですが、鉄腕アトムのようなロボットが出来てる訳じゃありません。今人工知能と呼ばれているものは基本的にあなたが使っているパソコンと同じ仕組みのコンピューターで出来ています。ただあなたが慣れ親しんでいるのとちょっと違う使い方をしていて、その使い方を人工知能と呼んでいます。その使い方は "機械学習" と呼ばれています。

機械学習って何ですか?

今回は概要理解のため超ざっくりと機械学習を説明します(*1)

機械学習を一言で言うと "分類機械" です。もうちょっと難しくいうと『判断基準をプログラムにロジックとして入れ込むのが難しいケースでもデータを元に傾向をつかみおそらくだいたい正しい選択肢を提示する』仕組みです。

何ができるのか?

そう言ってもなかなかイメージつかめないと思うので実際の例で説明すると 

  • 画像分類...多くの画像から人が写っているものを分類
  • 文書分類...Webの記事を政治、経済、スポーツ、芸能、その他に分類

写真に人が写ってる判断基準やWebの記事の内容の判断基準を説明しろって言われても難しいですよね、説明できないものはプログラムできません。コンピューターはこういうデータ(非構造化データと言います)を扱うのが苦手でした、機械学習を使うとこれを扱えるようになります。

  • 迷惑メール...送られてくるメールから迷惑メールを検知して分類
  • カード不正...カードの使用情報から不正使用を発見

迷惑メールやカード不正とも日々新しい手口が開発されているので判断基準作ること自体が難しいです。また、いろいろある情報をもとにすると何らかの相関を発見できそうだけど人間がそれをあぶり出すのは困難です。こういうケースでも機械学習が活躍します。

どうやってやるのか?

機械学習のやり方をイメージでいうと "調整つまみ" がたくさん付いている分類器です。この分類器は使う前に用途に応じて "調整つまみ" を調整する必要があります。

例えば人が写っている写真を分類したい場合、大量の写真データを準備します、写真にはあらかじめ ”人が写っている” , ”写っていないというラベルをつけておきます。これを分類器にインプットして分類を行います。分類器はラベルを見ないで分類を行い、その結果とラベルを比較して答え合わせをします。正しく仕分できた場合はそのまま、間違えた場合は少しづつ"調整つまみ(パラメーター)"を調整して徐々に正解率を上げていきます。実用に耐えうる精度が得られるまでこれを続けます。

これが人間が "学習"する過程と似ているので『機械学習』と呼ばれていますが、実際にやっているのは調整つまみの調整、もっとストレートに言うとパラメーター調整です。

実装方法

 機械学習には色んな実装方法があります。ニューラルネットワーク、サポートベクトルマシン、ベイジアンネットワーク、などなど。どれもデータを元に学習(パラメーター調整)を行って実際に使うという部分は一緒です。

最近よく耳にする『ディープラーニング(深層学習)』はニューラルネットワークに分類される手法で、最近これを使うことで分類の精度が飛躍的に向上した分野もあり今の人工知能ブームの火付け役になっています。ディープラーニング(深層学習)』という名前から「人知を超えたすっごい深遠なことを考えている」と誤解する人がいるのですが単なる機械学習の一手法に過ぎません。

どうして今ブームに?

機械学習という考え方自体は昔からありました。先ほど言った今回のブームの立役者の一つ『ディープラーニング(深層学習)』も、使っている手法は昔からあるもので特に新しいものはありません。

ではなぜ今ブームなのか、それには2つの理由があります

(1)大量データ

機械学習が学習して実用に耐える精度を実現するためには大量の学習用データが必要です。昔はそれだけのデータを入手するのが困難でした。Bigdata時代とも言われる現在、データの入手が可能になりました。

(2)コンピューターの性能向上

学習は多くの調整つまみ(=パラメーター)を調整する必要があります。昔のコンピューターの性能ではこの調整に時間がかかりすぎるので大規模な調整器を作っても実用に耐える時間で学習させることが困難でした。昨今のコンピューターの性能向上で実用に耐えうる時間での学習が可能になりました。

何がすごいのか?

コンピューターを使って『過去のデータからおそらくだいたい正しい答え』を出せるような仕組みを実現できたこと、その精度が上がってきたことは大きな可能性を持っていると筆者は思います。人間の思考方法でいうと『帰納的』な推論をコンピューターに実行させることで新しい形で人間の意思決定支援を支援できるようになると思っています。

 

しかし、、、

世で議論されている人工知能の出来ること、その影響については誤解に基づいた意見も多いと感じています。ということで来週は

なぜ誤解が生まれるのか?その原因と対策

 

(*1) 今回機械学習の概要をザクッと理解いただくため、かなりざっくりした説明になっています。機械学習で出来ることは今回説明した分類以外に回帰とかクラスターなどがあります。学習方法には今回説明した教師あり学習という手法以外に教師なし学習、強化学習などがあります。また実際はデータを訓練データとテストデータに分けて過剰適合していないかを確認するなどのステップもありますがこの説明で割愛しています。その他いろいろはしょってる部分の詳細はこの連載の中で説明していく予定です。

 

 

 

 

 

 

 

 

 

 

文系のための人工知能 〜前提知識ゼロから始める人工知能〜

最近人工知能ブームと言われてます。メディアでは連日のように人工知能間連の話題が取り上げられています、本屋に行くと「人工知能時代の〜」とか「AIが変える〜」とかいう本が平積みされています。

しかし一方「人工知能って何?難しそうで正直よくわからない」と言う声もよく聞くようになりました。

どうしてわからないのか?

これだけ情報が溢れているのにどうしてよく分からないという声が多いのか?

人工知能で世の中がこうなるという雑多な情報が溢れかえっていること、その一方で人工知能そのものに関する情報は専門的すぎて敷居が高いこと、の2つが理由だと私は考えます。

世に溢れる人工知能でこうなる情報

世に溢れる情報の多くが「人工知能で世の中どうなる」というもの。いろんな分野の著名な方々が人工知能で世の中こう変わる」と語っています。人工知能自体が理解できていない文系人間にはその語りが「その人の専門的な知識に基づいているのか?」「その人の個人的な意見なのか?」の区別がつかず、どれを信じていいのかわからないんです。

敷居の高い人工知能入門

「やっぱ自分が人工知能自体を理解しないとはじまらない、勉強しよう」と "人工知能入門" という題名の本を見つけて読み始めたとします。あなたが文科系の人の場合、数ページ目で難しそうな数式が出てきて挫折、というケースが多いと思います。世に出ている入門の多くがある程度の数学知識を前提としているので文科系にはとても敷居が高いのです。

わからなくてもいいのか?

「どうせ難しくて文系には理解できないんだから分からなくていい」という声も聞きます。

確かに万人が人工知能について専門家レベルの知識を持つことは現実的ではありませんしそこまで知る必要も無いと思います。

しかしみんなが『ある程度のレベルの理解』を持つことは十分可能ですし、人工知能というテクノロジーが今後有効活用されていくためには万人共通の『ある程度のレベルの理解』を造ることが必須であると私は考えます。私がなぜそう考えるかを2つのポイントで説明します。

人工知能の判断を鵜呑みにしないために

人工知能は「なんかすごいみたいだから」というだけでその判断を鵜呑みにしてしまうのは『お告げに従う』姿勢と大差ありません。人工知能がどんなに発展しようと最終的な決定を行うのは人間です。人工知能の出した判断を鵜呑みにすることなく、正しく評価するためには人工知能に関する『ある程度のレベルの理解』が必要です。これがあって初めて人工知能の有効活用が可能になると私は考えます。

人工知能を有効活用するアイデアを生むために

一般的にあるテクノロジーの専門家と、そのテクノロジーを活用する人は同じではありません。例えばテレビというテクノロジーの専門家だけではテレビドラマを作ることはできないですよね。人工知能も同じで、他の分野の人が人工知能というテクノロジーを活用することで、専門家だけでは考えつかないような大胆かつ素敵な活用方法が生まれてくると私は考えます。ただ全く理解できないものを活用することはできません。専門家以外の人が人工知能というテクノロジーを活用するためには人工知能に対する『ある程度のレベルの理解』が必要です。

どうやって『ある程度のレベルの理解』をするのか?

ここまで読んで「そんなことはわかってる、でもその『ある程度のレベルの理解』が面倒で難しいんだよ」と思った方も多いかと思います。

確かに文科系の人間にとって人工知能を理解するのはかなり敷居が高そうに見えます。これは人工知能という山への登山ルートが理系用に作られているためです。同じルートを登るのではなく、文科系用の登山ルートを登っていけばいいのです、そのルートでは理系のルートでは見えなかった景色も見えてくると思います。次回から私が今登っている文系用の登山ルートをご案内していきます。

 

 

 

ゲームとコンピューターと実世界

1997年チェス名人に勝ったのを皮切りに、最近はコンピューターが囲碁名人に勝った、将棋でコンピュターと羽生名人が対戦、などゲームの世界でコンピューターが脚光を浴びています。「コンピューターが人類を超える」なんてことも言われてたりしますね。さて実際のところどうなんでしょう?
今回はゲームをお題にコンピューターと人間について考えてみたいと思います。

ゲームとコンピューター
チェス、囲碁、将棋で人間を圧倒しはじめたコンピューターですが、ゲームのやり方は人間とコンピューターでどう違うんでしょうか?
ゲームで勝つためにやるべきことは人間だろうがコンピューターだろうが一緒「最善の一手」を指すこと、この積み重ねが勝利につながります。
この「最善の一手」の判断方法に人間とコンピューターの違いがあります。

人間のやり方
プロ棋士は、たくさんある次の一手の候補から、筋のよさそうなものを候補として選択し、選んだ候補それぞれ何手か先まで読んで「そこに打ったらその後の展開はどうなる?」を考え最も有利な戦局になるものを選択しています。
プロ棋士はこの際の判断基準に、自分の過去の経験に基づく"論理的な思考能力"と"ひらめき"を使っています。
先日将棋の羽生名人が「たくさんの手を読むことが強いということではない」とテレビで言ってました。名人も全部の手を考えている訳ではないのです。

コンピューターのやり方
一方のコンピューターはどうやって「最善の一手」を決めているのでしょう?実はいろんなこれまでいろんなやり方が試されてきました。

(1)全部調べる
コンピューターの計算能力の高さに頼って全部調べるやり方。全部の次の一手、それぞれの一手のその後の全部のパターンを調べる方法です。
3目並べくらいの簡単なゲームだとこの方法で必勝コンピューターを作れるんですが、チェス、囲碁、将棋のような選択肢が膨大にあるゲームでは全パターンを調べていたらいついつまでたっても終わないので現実的ではありません(どのくらい終わらないのかはこの文書の後半で)。

(2)筋のいい手に絞って数手先まで読む
さすがのコンピューターも力任せの全調べは荷が重いので人間と同じように"筋のいい手に絞って数手先まで読んで一番有利な戦局になるものを選ぶ"という方法です。
ここで問題になってくるのは「有利な戦局」の判断基準です。

a.プログラムする
戦局を評価するノウハウを詰め込んだプログラムを作成する方法です。この場合プログラムの質は作成する人のゲームの知識の大きく左右されます。
この方法はある程度の成果を収めていますが、囲碁、将棋の名人レベルになるには至っていません。
特に囲碁の場合は次の理由で評価プログラムの作成が難しいとされています。
(1)将棋、チェスはいろんな種類の駒があるから評価に使える、一方囲碁は駒は白黒だけなので評価の材料に乏しい
(2)囲碁は終局まで大勢が決しないことも多く局面の評価が難しい

b.やってみる
評価するロジックを作るのが難しいのなら、実際にゲームをやってみてその結果を判断基準に使おうというアプローチです。
代表的な例がコンピューター囲碁でつかわれているモンテカルロ法です。
囲碁のある局面から白黒を交互に適当においていって(最低限ルールには沿うようにします)どっちが勝ったかを調べます。
これを何回も繰り返した結果を元に次の一手を評価します。イメージ的にはへたくそな二人が何回も対戦しているのと似てます。
同じレベルの下手くそ同士が何回も対戦した結果だから、腕の差ではなく局面が有利だから勝ったんだろうという発想です。
次の一手で勝率の高かったものについて二手先、三手先と掘り下げていくことで「筋のいい手を」「先読みする」を実現しています。
これでコンピューター囲碁はかなりのレベルになりましたがまだまだ名人に勝てるレベルではありませんでした。

c.過去のデータを使う
囲碁は過去の対戦の棋譜が数多く保存されていて比較的簡単に入手できます。この膨大なデータを活用して評価の精度を上げようというアプローチです。
この手法は「教師有り学習」と呼ばれており、最近よく耳にする"機械学習"の手法のひとつです。
一流プロの棋譜を学習教材として、一流プロと同じ次の一手打つようにコンピューターを学習させていくのです。
一流プロと同じ手を打つ=一流プロの次の一手を教師として使う、ので教師有り学習と呼ばれています。

d.コンピューター同士で対戦させる
ある程度強いコンピューター囲碁のプログラムが出来てきたら、コンピューター同士で対戦させてさらに強くしようというアプローチです。
この手法は「強化学習」と呼ばれており、こちらも最近よく耳にする"機械学習"の手法のひとつです。
コンピューター同士を対戦させて勝った方にご褒美を上げるイメージで学習させていくのです。

先日囲碁名人に勝利したAlphaGoはモンテカルロ法機械学習を組み合わせて作られています。将棋の世界で最強と呼ばれているプログラムも機械学習を取り入れています。

コンピューターの認知力アップ
ゲームの世界で名人にせまっているコンピューター、そこでは機械学習が大きな貢献をしています。機械学習はゲーム以外のいろんな分野で活用されはじめています。
機械学習の活用によりコンピューターの新しい使い方が生まれてきています、これをコンピューター認知力がアップしたという言い方をする人もいます。
ここから認知力アップってなんだ?を簡単に説明したいと思います。

認知力アップ その1 帰納的認知力
人間がやりたいことをプログラムしてコンピューターにさせる、これが従来からあるコンピューターの使い方ですね。
簡単な例だと底辺と高さから三角形の面積を求めたいとすると 底辺 x 高さ ÷ 2 というロジックを含んだプログラムを書きます。
いったん書いてしまえば、底辺と高さのデータをコンピューターに入れれば必ず正しい面積を出してくれます。

しかし、世の中やり方を説明できるものばかりではありません。カードの使用履歴等からカード犯罪を検知しようとした場合、世にたくさんある個々のカード犯罪の手口を全部プログラムに書くのは無理がありますし、かりに全部書いたとしても明日には新しい手口が生まれてきますから、従来の「プログラムにやり方を書く」アプローチでの対応は難しいですね。

そこでアプローチを変えて、理由は説明できないけど過去のデータを元に「こういう取引データの場合は不正使用の可能性が高い」という "おそらくだいたい正しい" 傾向をあぶりだす、これが最近はやりのアプローチです。

従来のコンピューターの使い方が「正解に導くロジックをプログラムに実装する」のに対して「データからおそらくだいたい正しい傾向をあぶりだす」ので前者を演繹的アプローチ、後者を帰納的アプローチと呼んだりします。帰納的アプローチで使われるのが機械学習という手法です。

機械学習にはいろんな種類がありますが基本的に全部「データからおそらくだいたい正しい傾向をあぶりだす」という帰納的アプローチをとってます。
また、機械学習では入力されたデータを元にパラメーターを調整して最適な答えを導くというアプローチをとるのでデータがとても重要な役割を果たします。これが学習と呼ばれる理由です。
機械学習のプログラムだけあっても何の役にも立ちません、適切なデータで学習することで初めて価値を生みます。従来の演繹的アプローチではプログラム自体が重要な価値を持っていてデータはあくまで処理するものとなっているのと対照的ですね。


認知力アップ その2 非構造化データの認知力
機械学習ではデータが重要というお話をしました。より多くの多様なデータを活用することで機械学習の精度、適用分野も広がります。
世の中にはいろんなデータがるのですが、実は従来コンピューターが使っていたデータはその20%にしかすぎませんでした。
その20%は「構造化データ」をよばれるもので、ざっくりいうと "Excelのシートでまとめることができる、きちんと形式の決まったデータ" です。
残りの80%は「非構造化データ」といわれるもの。ざっくりいうと つぶやき,メール内容、 画像、音声など形式の決まっていないデータです。
これを活用しない手はない、ということで非構造化データをコンピューターが処理できる形式にして活用しようというのが最近の流行です。
非構造化データをコンピュータが認知できる形式にする際も機械学習が使われています。

*帰納的アプローチはこれまでのコンピューターの使い方に慣れている人にとっては抵抗感があるかもしれません。「おそらくだいたい正しい」「やりかたを説明できない」という
部分がとても頼りなくみえてしまうのです。『機械学習』に加えて『統計学・確率論』を理解するとこのもやもやが晴れていきます。

ゲームを制したコンピューターは現実世界も制するのか?
ゲームの世界では名人にせまる勢いのコンピューター、これをもって「コンピューターが人間を追い越す」という論調のお話も最近は聞かれます。
しかし現実の世界には囲碁、将棋とは全く異なる難しさがあります、コンピューターが人間を追い越すのはそんなに簡単なお話ではないと私は考えます。

ゲームのルール
チェス、囲碁、将棋はゲーム理論の定義では「二人ゼロ和有限確定完全情報ゲーム」という分類に入りますが、現実の世界のゲームには他のいろんな種類があります。

(1)完全情報
チェス、囲碁、将棋は判断に必要な相手の情報が全て分かっています。盤面の情報、自分が持っている駒、相手の持っている駒は全部わかりますよね。相手が急に隠し持った角を打ってくるなんてことは起こりませんよね。
同じゲームでもポーカーは相手の持ってる手札はわかりません。現実の世界では競争相手の情報を全部把握できるなんてことはまずありません。現実世界では不完全な情報下で意思決定を行う必要があるのです。

(2)確定
チェス、囲碁、将棋は偶然、確率の要素は全くありません。同じ盤面で同じ手を打てば必ず同じ状況になります。
同じゲームでもポーカーは次に来る手札によって大きく戦局がかわってきます。現実世界でも意思決定は確率的な要素を考えて行う必要があります。

(3)二人ゼロ和
チェス、囲碁、将棋は対戦する相手は一人、ゲームの結果は必ず勝ちと負け、もしくは引き分けととてもシンプルです。
同じゲームでもポーカーは複数の人と対戦するので戦略的な要素が入ってきます。現実の世界では目標達成のために複数の相手と時に競争し、時には手を組んでいきます。またその結果は必ずしもゼロサムではありません。
みんながプラスになるケースもありますし、逆にみんなマイナスになってしまうケースもあります。

(4)有限
チェス、囲碁、将棋は手を進めていくと必ず終わりに到達します。現実の世界ではエンドレスに戦いが続いていくケースもあります。

(5)そもそもルールは決まっている
チェス、囲碁、将棋ではゲームのルールは決まっており、定められたルールの中で最善を尽くす必要があります。
現実の世界では定められたルールの中で最善を尽くすこともありますし、最適な結果を得るためにルールを変更する場合もあります。

* 現実の世界のゲームはチェス、囲碁、将棋より複雑です。さまざまな現実の世界でのゲームで適切な判断を行うのに役立つのが『ゲーム理論』という考え方です。
* また一般的な経済のルールがうまく機能しない時に新しいルールを作成している例として『マーケットデザイン・オークション理論』などがあります。

目的設定
チェス、囲碁、将棋の目的はとてもシンプル「相手に勝つこと」、現実の世界では目的はあらかじめ決まっている訳ではありません。
意思決定をする人が「自分にとって最適な結果は何か?」「集団にとって最適な結果は何か?」を定義することから意思決定ははじまります。

* 意思決定の目的について理解するためには『経済学』が役立ちます。個人にとっての合理的選択、集団にとっての合理的選択、不確実な状況下での合理的選択などを理解すると
目的設定に関する理解が深まります。

コンピューターに出来ること
ゲーム名人を圧倒し始めたコンピューターは現実の世界のゲームで力を発揮できるのでしょうか?決して人間を圧倒はできないが、人間を強力に支援することができるというのが私の考えです。

(1)目的設定
まず意思決定をする際の目的設定、これは人間がやるしかないです。自分がやりたいことわかんないからコンピューター決めてとお願いする訳にはいかないですよね。

(2)仮説立案
目的を設定してそこに到達するために何をすればよいか、言い換えると「こうすれば目的達成できるはず」という仮説を立てる、これも人間のお仕事です。
「個人の経験、直感に基づいて筋のいい仮説を立てることが重要」と経営系の本にもよく書かれています。この方法、たいがいのケースでうまくいくのですが失敗するケースもあります。
従来と同じビジネスモデル(=ルール)で生産性を高めるという目的の場合はこの方法はとても有効です。一方まわりの状況が変わっていてそれに対応する必要がある状況では個人の経験、直感が「がんこな思い込み」になってしまうケースがあります。

人間の経験・直感は大切ですが、注意しないと過度な自信と思い込みを生んで道を誤る原因になるのです。
ではどうすればいいのか?ここは帰納的認知力を身につけたコンピューターの出番です。コンピューターに仮説をたてさせる、具体的には数多くのデータを元にコンピューターに人間では気づかない「おそらくだいたい正しい」相関を発見させて、その発見した相関を元に仮説を立てればいいのです。

*人間の思い込みの危険性・不合理性への理解を深めるには『行動経済学』『認知心理学』の知識が役立ちます。

コンピューターの苦手なこと
実はチェス、囲碁、将棋のような「二人ゼロ和有限確定完全情報ゲーム」は先手必勝、後手必勝、引き分け、のどれかなんです。
全部のパターンを調べるとそのどれか必ず分かるので、これを一瞬にして把握することができるゲームの神様同士の対戦は先手、後手を決めた時点で勝敗が決してしまうので神様にとっては面白くもなんともないんです。
実際同じゲームの分類であるチェッカーについてはお互い最善手を選択した場合必ず引き分けになることが判明しています。しかし冒頭に述べたように、チェス、囲碁、将棋のような選択肢が膨大にあるゲームでは全パターンを調べていたら
どんなに高速なコンピューターでもいつまでたっても終わりません。たとえば囲碁の盤面は19x19ですから初手の候補が361個(19x19)、次一手が360個、その次の一手がそれぞれ360個、となっていくので
全パターンは361x360x359x。。。。。これ最新コンピューターでも宇宙が始まってから今までずっと計算してても終わらないくらいの膨大な数字になります。
高速化が進むコンピューターですがこのような指数的に処理量が増加する処理はさすがにお手上げです。
この性質をうまく利用しているのが現代の暗号化技術です。因数分解をするための効率的なロジックは無く、しらみつぶしに候補を探す必要があります。因数分解対象の数字が一桁ふえるごとに処理量は
指数的に増えていくので2つの数字(素数)を掛けておおきな数を作ってみんなにみせても、2つの数字を見破られる可能性はほとんど無く、これが暗号化技術の元になっています。
いま話題の量子コンピューターを使うと因数分解を高速に処理できる可能性があります、量子特有の性質を使うことで因数分解対象の数字が一桁ふえても指数的に計算量がふえていかない仕組みを作れる可能性があるのです。


囲碁とコンピューター

コンピューターが囲碁名人に勝ったというのがニュースになってます、面白そうなので調べてみました。

 

囲碁、将棋、チェス、チェッカー、三目並べは仲間です

どれも”二人で対戦する”、”どっちか勝てば、もう一人は負ける”、”相手の情報は全て分かる”、”手数の組み合わせは有限”という点で同じ分類になります。こういうゲームを「二人零和有限完全情報ゲーム」とよびます。

 「二人零和有限完全情報ゲーム」は先手、後手が最善手を指すと必ず”先手必勝”、”後手必勝”、”引き分け”のどれかになることが証明されています。三目並べ、チェッカーはその手順が発見されていますが、囲碁、将棋、チェスではまだ発見されていません。

 

三目並べをコンピューターにやらせるには?

三目並べは最善手の手順(結果は必ず引き分けになる)が発見されています。コンピューターに三目並べをやらせる場合はその最善手のロジックをプログラムすればいいですね。

* 最善手はリンク先「戦法のこつ」を参照ください 三目並べ - Wikipedia

 

最善手が発見さている三目並べだとこの方法がとれますが、囲碁・チェス・将棋の場合最善手はわかっていません、手数も段違いに多いです。ではどうすればいいか?

 

チェス・将棋をコンピューターにやらせるには?

次の一手のパターン、その次の一手のパターン、… こうやって終局までの全てのパターンを調べようとすると、指数的にその対象が増えていくのでどんな優秀なコンピューターでの現実的な時間で全てのパターンを調べて評価することはできません。

そこでチェス・将棋で一般的に使われるのが評価関数です。

 

評価関数とは?

終局までのパターンを調べる替わりに、数手先までのパターンを調べてそのそれぞれのパターンを評価して最善手を決める方法です。なんらかの基準(例えば持ち駒の種類、数など)によるその時点での優劣が評価関数に使われます。

 

囲碁をコンピューターにやらせるには?

囲碁も基本的にはチェス・将棋と同じなんですが、違いもあります。

ひとつは手数の組み合わせが多いこと、囲碁の盤面は 19 x 19 手順の組み合わせはチェス・将棋と比べても段違いに大きいです。

もうひとつは”評価関数の作成が難しい”ということ、将棋・チェスの場合は持っている駒である程度優劣が判断できますが、囲碁の場合はみんな同じ石、しかも囲碁は終盤まで優劣が明確にならないという特徴があるので評価関数を作るのが難しいとされてきました。

この課題を解消するため使われているのが「モンテカルロ木探索」という手法です。

 

モンテカルロ木探索とは?

モンテカルロ木探索をざっくり”木探索”と”ロールアウト”というキーワードで説明します。

ロールアウト

評価関数作るのが難しいなら実際にそこから囲碁やってどうなるかみてみよう、というアプローチです。ある局面からコンピューターにランダムに手を打たせて(最低限の囲碁のルールは守って)最終的にどのくらい勝つ確率が高いか調べようという発想です。

 

木探索

先読みの手数が多くなるほど選択枝は増えていきます。1手先に4つの選択枝があるとしてその先のそれぞれに4手あるとすると1手先:4手、2手先:16手、3手先:64手、このように指数的に増えていくので全部調べていたら大変だから有望な手筋だけしらべるようにする仕組です。枝を選定していくイメージですね。

 

この方法で作った囲碁プログラムは強くなったけどトッププロにはまだまだ遠く及びませんでした。

 

AlphaGoのアプローチ

まだトッププロに勝つには10年くらいかかるといわれていた中、トッププロに勝利したAlphaGoはどんな仕組みになってるのか、ざっくり説明してみます。

 

仕組み

モンテカルロ木探索をベースに機械学習を追加して機能強化した作りになってます。

木探索

機械学習(畳込みニューラルネット)を使って実装された"Value Network" を使用して最適な探索を決定。

評価

機械学習(畳込みニューラルネット)を使って実装された"Policy Network" とモンテカルロ木探索で一般的に使われているロールアウトを併用して局面を評価

 

学習方法

学習を二段階に分けて行っています。

第一段階 教師有り学習

過去のプロの対戦棋譜を入力データとして使い教師有り学習を実施。

第二段階 強化学習

次にコンピュータープログラム同士を対戦させて学習を実施。とてもざっくり簡単にいうと勝った方にご褒美あげていく方法。

 

ここで使われている機械学習の手法は特別なものではなく一般的なものです。これは機械学習の特徴(ロジック自体はシンプルで汎用的、特徴抽出とデータによる学習が重要)を表していると思います。

 

*誤りあればご指摘いただければ幸いです

 

参考書籍 

http://ecx.images-amazon.com/images/I/419jx%2Bf%2Bf0L._SL75_.jpg

http://ecx.images-amazon.com/images/I/414ZpLD-OSL._SL75_.jpg

計算科学:ディープニューラルネットワークと木探索を用いた囲碁の習得 

http://www.nature.com/nature/journal/v529/n7587/abs/nature16961_ja.html?lang=ja

 

 

 

このサイトの掲載内容は私個人の見解であり、必ずしも私が所属する会社、組織、団体の立場、戦略、意見を代表するものではありません