コンピュータの最近のブログ記事

AlphaZero

user-pic
0

12月6日にISSEIさんからコメント戴いた、AlphaZeroについて、ねとらぼの記事に基づきまとめてみる。

その記事によると、以下のとおり:

世界最強の囲碁AI「AlphaGo Zero」を開発したDeepMind(Google関連会社)が、チェスと将棋のAIに関する論文を発表しました。AlphaGo Zeroと同様の手法を使い、24時間で既存の最強AIを超える実力に至ったとのこと。
AlphaGoは2017年5月、世界トップ棋士である中国の柯潔(かけつ)九段に3戦全勝した囲碁AI。もともと人間同士の棋譜(対局データ)を学習させていましたが、進化したAlphaGo Zeroでは人間の棋譜を用いず、AIによる自己対戦のみで強くする「強化学習」が用いられました。

何度読んでも、ほんまかいなと思ってしまう。しかし、いくらなんでも天下のDeepMindが、ガセの内容を発表するわけがない。具体的には以下のとおり:

今回の論文では、AlphaGo Zeroで用いられた手法を「AlphaZero」という名称で一般化し、チェスと将棋にも適用。24時間の学習の結果、チェスでは既存の最強AIとして知られる「Stockfish」相手に100戦して28勝0敗72引き分け、将棋でも同じく最強AIである「elmo」相手に90勝8敗2引き分けという戦績を残しました。

それにしても、ポナンザで、

ただ、AIの手法も駆使したからといって、ポナンザが単調増加で強くなるわけではない。むしろ強くなればなるほど、棋力の向上は大変である。現在では、前の版と3000局指して、52%以上の勝率になることを目指している。こういう棋力の向上策は、いまのところ暗中模索である。
と書いたこととは全くパラタイムが違うということである。

そういえば、AlphaZeroのアナウンスは、ISSEIさんのコメントのように、私が永世七冠を投稿した日だったが、その朝私は、まだAlphaZeroのことは全く知らず、通勤の行きの電車で、深層学習の専門書のボルツマン・マシンの章を一心不乱に読んでいた。あまりに没入したので、電車を降りて、昼食用のパンとおにぎりを例によって三鷹のローソン100で買うとき、ポンタカードを一度出したのを忘れて、二度目も出そうとし、また支払いのPASMOを読み取り機に置き忘れて、そのまま立ち去ろうとして店員から注意された。いくら私が粗忽だからといって、こんな経験は今まで一度もない。多分、AlphaZeroの衝撃が無意識のうちに私に伝わってきていたのだろう。

ほとんどのシステムのログインは、ユーザーIDとパスワードの組み合わせを入れるようになっているが、パスワードは、セキュリティ要件を満たすため、定期的に変更することが必要だったりする。すると、その都度新しいパスワードを考える必要があるが、セキュリティ仕様として、パスワードの長さや、含むべき文字種などが決まっていることがあり、適当に作ったパスワードがセキュリティ仕様を満たさないとして拒絶されてしまい、はたと困った経験がある。そこで、簡単ながら、任意の仕様を満たすパスワードを生成できる、以下のようなパスワード・ジェネレータをPerlで書いてみた。

このプログラムは以下の機能をもつ。

  1. 一度に生成してみるパスワードの個数を示す$n
  2. 生成されるパスワードの長さの範囲を指定する変数$L
  3. 使用可能な(あるいは使用すべき)特殊記号を一文字生成するサブルーチンCC()
  4. Upper caseのアルファベットを一文字生成するサブルーチンCA()
  5. Lower caseのアルファベットを一文字生成するサブルーチンCa()
  6. 数字を一文字生成するサブルーチンCn()

Perlのソースコードの例は、以下のとおりである。

for ( $n = 0; $n < 10; $n++ )     {
  $L = sprintf "%d",rand(6);
  $L += 8;
  $q = sprintf "%d",rand(4);
  for ($i = 0; $i < $L; $i++ )  {
  $q = ($q % 4);
  if ( $q == 0 )       {
    printf "%s",Ca();
  } elsif ( $q == 1 )       {
    printf "%s",CC();
  } elsif ( $q == 2 )       {
    printf "%s",CA();
  } else                    {
    printf "%s",Ca();
  } 
    $q++;
  }
  printf "\n";
}

sub CC     {
my @ZZ = qw/61 45 46 47 95 35 43 63 64/; # 使ってよい特殊文字を10進表示した
my $j = sprintf "%d",rand(9);
my $S = sprintf "%s".chr($ZZ[$j]);
return $S;
}

sub CA     {
my $b = 65;
my $j = sprintf "%d",rand(26);
my $S = sprintf "%s".chr($b + $j);
return $S;
}

sub Ca     {
my $b = 97;
my $j = sprintf "%d",rand(26);
my $S = sprintf "%s".chr($b + $j);
return $S;
}

sub Cn     {
my $b = 48;
my $j = sprintf "%d",rand(10);
my $S = sprintf "%s",chr($b + $j);
return $S;
}

ちなみに、実際に生成したパスワードは以下のとおりである。10個生成したのは、この中から気に入ったパスワードを選ぶためである。なお、Perl処理系にランダマイズ機能が含まれているので、実行する度に異なるパスワードが生成される。

2g_L5u.B5f?W7
g_W3p@W4e
#W5n.Q8b=
X4i.H4g=K
+T8h@U7g_
1t.N5r#H4k_
v/X4m_Y2b?
=L4f#G8j/A4e
9b=I4s?S5g
0y-B7n-W8

2次方程式が整数解をもつ割合に続き、蛇足とは思ったが、3次方程式が整数解をもつ割合についてもみてみた。

単なる直感で、3次方程式が整数解をもつ割合は2次方程式が整数解をもつ割合より少ないかと思ったら、確かに3次方程式が整数解をもつ割合は2次方程式が整数解をもつ割合の0.64倍程度であるが、案外大きい。

ただ、107の試行で、2つ以上を解をもつ場合というのは5回しか観察できなかった。

あまり豊穣ではないかもしれないが、どうもよく分からない世界である。ともかくプログラムのソースコードをリストする。少なくとも、高次になるほど複数の解をもちにくくなるということはいえるかもしれない。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

long long int QD(int a, int b, int c, int d, int x);

int main()     {
 int i,j,a,b,c,d;
 int e,f;
 srand(time(NULL));
 
 for ( i = 0; i < 10000000; i++ )  {
	a = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) a = -a;
 	b = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) b = -b;
 	c = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) c = -c;
 	d = rand() % 1000 + 1;
	if (( rand() % 2 + 1) == 1 ) d = -d;
 	e = 0; // 解の数
 	if ( d < 0 )
 	  f = -d;
 	else
 	  f = d;
 	for ( j = -f; j <= f; j++ )    {
		if ( j != 0 && (f % j) == 0 ) {
		  if ( QD(a,b,c,d,j) == 0 )       {
			if ( e == 0 )
		      printf("a = %4d,b = %4d,c = %4d, d = %4d, 解1:%d\n",a,b,c,d,j);
		    else if ( e == 1 )
		      printf("a = %4d,b = %4d,c = %4d, d = %4d, 解2:%d\n",a,b,c,d,j);
		    else
		      printf("a = %4d,b = %4d,c = %4d, d = %4d, 解3:%d\n",a,b,c,d,j);
		     e++;
		    }
		}
	}
 }
 
 return 1;

}

long long int QD(int a, int b, int c, int d, int x)  {
 return a*x*x*x + b*x*x + c*x + d;
}

スノーデン

user-pic
0

今年の2月だったか、知り合いとスノーデンのドキュメンタリー映画を観にいかないかと誘われて、行ってみると、映画館に結構人が並んでいた。へぇ、こういう映画も人気があるんだと思っていたら、目の前で一杯で打ち切られてしまった。その次の時間だと遅すぎるので、諦めて飲みに行った。

結局、スノーデンのことはそのままになったが、記憶の片隅に残っていたようで、最近書店で、「スノーデン 日本への警告」集英社新書を見つけたとき、とりあえず買った。もともと私は、長くIT企業にいたので、というか今も別のIT企業にいるので、コンピュータ・セキュリティに関しては、日本人の平均より少し上の知識と関心がある。そこですぐにこの本を読み始めた。

さて、この本の内容であるが、スノーデンが講演し、あるいはスノーデンにインタビューした内容を誰かが日本語に翻訳したものなのだろう。そのため複数の日本人が著者に名を連ねていて、そのうちのある人はインタビュアーであったり、コメンテータだったりする。それで誰が翻訳したのか分からないのだが、それはまあ特に不満というわけでもない。

この本によると、スノーデンは、NSAの職員として、NSAが米国内にあって、憲法で許された範囲を超える国民のプライバシー情報をマス・サーベランスしている実態を知り、内部告発として、内部情報を開示したのだった。

組織にあって、不正を内部告発するのは一般的には正当とされるが、NSAが当該の組織であってみれば、いくらなんでも相手が悪すぎる。それでスノーデンは国外追放され、いまはロシアにいる、というのが私の理解である。よくぞ密かに抹殺されなかったものだとおもう。

このように国家的なサーベランスが猖獗しているのは、9.11の結果ということであるが、サーベランスの密かな横行が国家の意図することであってみれば、9.11の陰謀性を想定することにあまり想像力を要さないはずである。

ただ、サーベランスのための技術のインフラは、前世紀末にはかなり揃っていた。それは情報処理技術、通信技術とそれを支えるハードウェア群であって、原子力工学、ロケットサイエンスなどの軍事転用可能な技術よりも日常的な技術の集積である。

さて、われわれは日常的にスマホや携帯電話をもって行動しているが、するとその位置は常時捕捉されている。さもないと基地局がそのスマホや携帯電話に電話をかけることができない。

スマホや携帯電話から誰かに電話をかけると、少なくとも、いつどの番号からどの番号にかけ始め、いつ通話が終了したかのメタデータがプロバイダのサーバに蓄積される。それは日常的には検索されることはないが、犯罪捜査や国家安全保障の目的で特定の電話番号関連の通話履歴をリストするのに使うことができる。

パソコンやスマホや携帯電話から送ったメールは少なくとも一定期間、プロバイダのサーバに蓄積される。蓄積された情報は、政府の捜査機関がそれを正当化する根拠を主張できるなら、プロバイダに提出するように命じることができる。

また、例えば日本と米国の通信網は、太平洋の海底に敷置された光ファイバで接続されているが、その光ファイバの終端装置は日本でいえばNTTコミュニケーションズ、米国でいえばAT&Tなどの会社が維持管理しているはずであり、原理的には国家が関与して情報を取得することが可能なはずである。

さらには市街地に設置されている監視カメラ、車のナンバーなどを読み取るNシステムなどさまざまなサーベランスのシステムが随所に配置されている。

要するに、監視する側からみれば使える手法は選り取り見取りであり、ただ問題は個人のプライバシーを保護する法律である。だからスノーデンは、市民がプライバシーに対する意識を高めて、政府に監視を制限するよう働きかけ、そのための立法も促し、また場合により重要な通信には独自の暗号化をほどこすように呼び掛ける。

つい悲観的になる私は、このような情報化社会にあってプライバシーを保護するためには情報通信から途絶された山奥に籠るしかないと思ったりするが、それも現実的でなく途方にくれる。

それでも、スノーデンの渾身の呼びかけは、妥当であり必要だろう。そもそも私を含めた一般人はいかに個人のプライバシーが危機に瀕しているか知らない。実は、政府機関が手段を尽くせば、情報機器を駆使して密かに任意のプライバシーを探ることは容易だが、そのことが違法であることの法律は是非とも立法化してほしい。はっきりいってそういう法律がどれくらい有効か私には分からない。そもそも私を含めた一般人は、やすやすとメディアの情報操作に踊らされている。それでも個人のプライバシーは重要である、と叫び続けるよりない。

AlphaGo zeroの記事で、2017年11月号の数学セミナーは、「コンピュータ将棋・囲碁のこれから」という特集号だったと述べたが、これについてもう少し補足してみる。

一般的に、数学セミナーの毎月の特集で、内容についていけないことも然ることながら、この分野は誰それが権威であるとか、そういうことは全くわからない。ごくたまに、ああこの著者の本はもっているね(あえて、読んだとはいわない)と思ったりする。

しかし、コンピュータ将棋・囲碁特集だとちょっと事情が違って、私でも少しだけ関係者に当たりをつけることができる。

最初は、電通大の伊藤毅志さんの「コンピューターチェス・将棋・囲碁」と題する記事で、二人完全情報確定ゼロ和ゲームのための基本的なアルゴリズムとその歴史の概観になっているが、まさに斯界の権威らしい充実した内容となっている。

次はponanzaの作者の山本一成さんかと思ったら、なんとPreferred Networksの前田新一さん、齋藤優樹さん、藤田康博さんの「ディープラーニングのインパクト」と題する記事だった。ここは本来の数学セミナー的な専門的な内容で、私には難解であるが、実はPreferred Networksは、山本一成さんとともにPonanza Chainerを開発したのであり、その技術的内容が最後に結構詳しく書かれてあって、興味深かった。

次は、ある意味旬のチームDeepZenの加藤英樹さんの「コンピュータ囲碁とディープ・ラーニング」と題する記事で、ここは「ディープラーニングのインパクト」ほどディープに技術に入り込んでいないので私にもある程度理解できる。

次におおっと思ったのは、将棋の千田六段の「棋士の認識とコンピュータ将棋の影響」と題する記事で、いろいろな経緯で千田六段というとひっかかることもなくはないのだが、記事の内容は流石に日常的にコンピュータ将棋を研究に使っているだけあって、感心する内容だった。

次は囲碁の光永六段の「囲碁の未来」と題する記事で、千田六段の記事の双対なのかもしれないが、ちょっと迫力に欠けるなあと思ってしまった。というのは、囲碁の棋士で囲碁AIを語るなら、第一人者は大橋拓文六段か王メイエン九段、あとは三村九段、白石六段も相当熱心である。この中から選んでほしかったなあというのが正直な感想である。

次は、はこだて未来大学の松原仁さんの「コンピュータ将棋・囲碁の今後」と題する記事で、松原さんも電通大の伊藤毅志さんと同様にこの分野で学会の権威である。そういえば、外資系にいたとき管理職研修に出たら、基礎研究所の知り合いのNさんがいた。私が将棋が趣味ですというと、松原さんの話題になった。松原さんは東大の同じ学科で同級生だったらしくて、Nさんは、コンピュータ将棋なんかやって、と苦笑いしていた。いまならもう少しポジティブな反応になるのではないだろうか。Nさんはその後、電通大の教授になられて、ホームページを見たら、知能情報研究室ということでAIも版図である。あれっ、コンピュータ将棋やコンピュータ囲碁は流石にやっていないか。

最後は、IBM Researchの岸本章宏さんの「チェッカー解明と人工知能」と題する記事で、えっ、今更チェッカーと思ったが、よく読むと完全解明の話で、一見シンプルなチェッカーも、コンピュータを駆使しても完全解明は相当大変のようである。するとオセロの完全解明ははるかに難しいし、将棋や囲碁となると、これはほとんど原理的に無理といってよい。

あっ、よくみたら、岸本章宏さんの記事は、コンピュータ将棋・囲碁特集とは別だった。かなり紛らわしい。

レスラー系のアトラクタを描いてみたものの、どうもあまりピンとこない。あまりカオスぽくないのである。それで次第にレスラー系のアトラクタのことは興味が薄れていった。

それからしばらくして、ある休日の朝、近所のスーパーに買い物に行こうと思い立った。意外かもしれないが、私はスーパーに行くのが好きである。いろいろな商品を眺めていると楽しくなる。すると家内が、卵も買ってきて、と頼むので、メモに書いて、胸ポケットに入れた。そうしないと最近、すぐに忘れてしまう。

そしてスーパーから買い物して帰ってきたはいいが、家内が「卵は?」と聞く。「えっ、買ったよ。」と応えた。レシートをみると確かに卵はリストされているのだが、確かに買い物袋には卵が入ってない。そこで記憶を辿ると、どうも卵を、買い物籠から買い物袋に移すときにそこに置き忘れてしまったようである。すなわち、卵は割れやすいので、最後に買い物袋入れようとおもって、いったん別のところに置き、そのままになってしまったようである。

そこで仕方なく、スーパーに戻ることにした。スーパーに行き、レジの女性に、「あのう、卵を忘れたみたいなんですけど。」と言ったら、サービスカウンタに聞いてみて下さい、という。そこでサービスカウンタにも、レシートを提示しつつ、「卵を忘れたみたいなんですけど。」といったら、ちゃんと卵がそこにキープされていて、あっさり渡してもらえてほっとした。私が忘れた卵をラッキーと持ち去る人がいたら仕方ないと思ったが、そういう人は案外いないものである。

で、ほっとして卵をもって帰りながら、空を眺めていたら急に、「レスラー系にポアンカレ断面を入れなさい。」と声が聞こえてきたような気がした。えっ、どういうこと?と考えてみた。もちろん、具体的な示唆はなにも与えられない。

で、自宅でコーヒーを飲みながら、1時間くらい思案して、以下のとおり、なんとか方針が決まった。
  1. レスラー系は、x,y,zの3次元のシステムだが、簡便のため、x,yの2次元でみる。
  2. ポアンカレ断面は、y = -xの、原点を通る、勾配-1の直線とし、この直線と常微分方程式の解の交点をみる。
  3. 解の交点は、原点からのユークリッド距離でプロットする。でも後で考えたら、勾配-1の直線との交点なんだから、単にxまたはyの座標値でもよかった。
  4. 一応、y ≧ 0と、そうでない場合とで分けて、前者は座標の正値に、後者は座標の負値にプロットする。
  5. a = b = 0.2で、cを2.0から4.3まで小刻みに増やして、それぞれでロジスティック写像のようにプロットする。

するとなんとまあ、下記のように、まるで蜘蛛の巣のような軌跡が現れて、なんだこれはとしばらく茫然となるほどだった。

そうか、精霊?はこれを私に見せたくて、「レスラー系にポアンカレ断面を入れなさい。」と言霊を降らしたのだな、と思ってしまった次第である。ともかく例によって、プログラムのソースコードを示す。
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Main.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
double fnx(double y,double z); 
double fny(double a,double x,double y);
double fnz(double b,double c,double x,double z);
double ROTx(double TH1, double TH2, double x, double y, double z);
double ROTy(double TH1, double TH2, double x, double y, double z);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Close1Click(TObject *Sender)
{
 Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Draw1Click(TObject *Sender)
{
const double H = 0.0001;
const pi = 3.14156;
double x,y,z;
double a = 0.2, b = 0.2, c;
double a1,a2,a3,a4;
double b1,b2,b3,b4;
double c1,c2,c3,c4;
double px, py;
int p_sgn, c_sgn;
int i,N;

for ( i = 0; i < 800; i++ )      {

 N = 0;
 c = 2.0 + 2.4*i/800.0;
 x = 2.0; y = 2.0; z = 13.0;
 if ( x + y >= 0 )
 p_sgn = c_sgn = 1;
else
 p_sgn = c_sgn = -1;
 
 while (N++ < 50000000 )  {
  a1 = fnx(y,z); 
  b1 = fny(a,x,y);
  c1 = fnz(b,c,x,z);
  a2 = fnx(y+H*b1/2.0,z+H*c1/2.0);
  b2 = fny(a,x+H*a1/2.0,y+H*b1/2.0);
  c2 = fnz(b,c,x+H*a1/2.0,z+H*c1/2.0);
  a3 = fnx(y+H*b2/2.0,z+H*c2/2.0);
  b3 = fny(a,x+H*a2/2.0,y+H*b2/2.0);
  c3 = fnz(b,c,x+H*a2/2.0,z+H*c2/2.0);
  a4 = fnx(y+H*b3,z+H*c3);
  b4 = fny(a,x+H*a3,y+H*b3);
  c4 = fnz(b,c,x+H*a3,z+H*c3);
  x += H*(a1+2.0*a2+2.0*a3+a4)/6.0;
  y += H*(b1+2.0*b2+2.0*b3+b4)/6.0;
  z += H*(c1+2.0*c2+2.0*c3+c4)/6.0;
  if ( x + y >= 0 )
   c_sgn = 1;
   else
   c_sgn = -1;
  if ( N > 10000 )                {
   if ( p_sgn != c_sgn )            {
     px = 30 + i;
     if ( y >= 0 )
	   py = 300.0 - 30.0*sqrt(x*x + y*y);
     else
	   py = 300.0 + 30.0*sqrt(x*x + y*y);
     Canvas->Pixels[px][py] = clBlack;
   }
  }
  p_sgn = c_sgn;
 } // end of while
} // end of for 
}
//---------------------------------------------------------------------------
double fnx(double y,double z)  {
 return -y-z;
}

double fny(double a,double x,double y)  {
 return x + a*y;
}

double fnz(double b,double c,double x,double z)  {
 return b + x*z - c*z;
}

double ROTx(double TH1, double TH2, double x, double y, double z)  {
 return cos(TH1)*cos(TH2)*x + sin(TH1)*y + cos(TH1)*sin(TH2)*z;
}

double ROTy(double TH1, double TH2, double x, double y, double z)  {
 return -sin(TH1)*cos(TH2)*x + cos(TH1)*y - sin(TH1)*sin(TH2)*z;
}

Fall Creators Updateで、ウイルスバスターのせいでWindows 10上でFall Creators Updateの導入に失敗したと書いたが、その後成功したので、将来の自分の参考用のメモとして記しておく。

まず修正プログラムを10月20日にトレンドマイクロが配布するらしいとウェブ上で確認したので、10月20日の夜、トレンドマイクロのホームページで、その具体的な手順を確認した。するとウイルスバスターのバージョンごとに適用する修正プログラムが異なると書いてあり、そもそも自分が使っているウイルスバスターのバージョンなんて知らないので戸惑っていたら、別の方法がガイドしてあるのを見つけた。

それは、パソコンのデスクトップにあるウイルスバスターのアイコンをダブルクリックして開く。そして画面にある「最新の保護機能」をクリックする。すると、ダウンロードが始まって、それが終わるとパソコンの立ち上げなおしを要求される。

パソコンが立ち上がった段階で、ええともうこれでFall Creators Updateを導入していいんだよねと怪訝になりつつ、「Windowsの設定」の「更新とセキュリティ」のから、「更新プログラムのチェック」をクリックすると、Update for Windows 10 Version 1709 for x64-based Systems (KB4041994)の導入が始まった。ところがこの導入のためのダウンロードが異様に遅い。先日導入したばかりなので、そうだっかな、まさかここでハングしてないよねと思いつつ、金曜日の夜だったので、そのまま寝た。

朝起きると、KB4041994の導入が終わり、再起動の画面になっていた。前回はここに辿り着く前に押し戻されたので、ウイルスバスターは一応邪魔しなかったのだと安堵した。しかしここからがさらにあと一時間もの旅である。それで最後まで完了したときは安心した。

再起動してウイルスバスターのアイコンを開き、各コンポーネントの詳細を見てみると、挙動監視コアドライバ(64ビット)7.0.1147の日付が2017/10/20となっており、これの旧バージョンがFall Creators Updateを堰き止めていたようである。

Fall Creators Update、すなわちUpdate for Windows 10 Version 1709 for x64-based Systems (KB4041994)が導入されたので、「更新とセキュリティ」を実行してみると、2017-10x64ベースシステム用Windows 10 Version 1709 セキュリティプログラム(Adobe Flash Player対応) (KB4049179)が導入され、これにて全行程が終わった。

この程度のことは自明な処理のようであるが、私程度のスキルでは結構大変に感じるのだった。

AlphaGo zero

user-pic
0

最新号、すなわち2017年11月号の数学セミナーは、「コンピュータ将棋・囲碁のこれから」という特集号だった。他でもない数学セミナーがついに将棋・囲碁のAIソフトを取り上げるのだなあと感慨に耽っていたら、新聞の第一面に衝撃的な記事が掲載された。ここでは時事通信社の記事を引用させて頂く。

昨年3月、世界最強とされる韓国人棋士に圧勝した囲碁人工知能「アルファ碁」の改良版「アルファ碁ゼロ」が開発され、旧アルファ碁との対局で100戦100勝の成績を挙げた。
旧アルファ碁は過去のプロ棋士の対局を学習し、アルファ碁同士の対局(自己対局)を繰り返して進化を遂げたが、アルファ碁ゼロは「お手本」を必要とせず、自己対局だけで世界最強の能力を身に付けた。論文は19日付の英科学誌ネイチャー電子版に掲載された。
人工知能(AI)はさまざまな分野で目覚ましい進化を遂げているが、最初の学習には人間の専門家による知識が必要で、データ化や入手が難しいなどの問題があった。
米グーグル傘下の英グーグル・ディープマインド社が開発したアルファ碁ゼロは、過去の対局などの学習用データ入力なしに、白紙の状態から自己対局を繰り返して、指し手や盤面の評価を自ら学んでいくプログラムを搭載。旧アルファ碁では、人間の指し手の学習と訓練に数カ月かかっていたのに対し、アルファ碁ゼロは数日間、約500万回の自己対局で性能を向上させた。プログラムの改良により、計算に用いるコンピューターチップの数も少なくて済むという。

私が別の記事でみたところで補完すると、アルファ碁ゼロが100戦100勝したのは、去年3月にイ・セドルと戦った版であって、アルファ碁最後の対局で述べた、囲碁の未来サミットで柯潔九段と三番勝負した版ではない。そもそも柯潔九段と三番勝負した版は、イ・セドルと戦った版より三子強いというのだから、100戦してもう少し勝てるはずである。

そこで今恐ろしいことに気づいた。それは、イ・セドルと戦った版でも既に、人間のトップ棋士より強いといわれている。だから、イ・セドルに4勝1敗だったわけだが、そのイ・セドルと戦った版より柯潔九段と戦った版は三子強く、それよりもアルファ碁ゼロはさらに強いのだから、少なくともイ・セドルと戦った版より四子は強いということになる。しかもアルファ碁ゼロで囲碁AIの棋力が飽和しているわけではないはず。すると、アルファ碁ゼロと人間トップの差は、人間トップと並のアマチュア県代表の差よりも大きいということになって、いよいよ人間は及びでないということになる。ちなみに将棋の方でも、一部のプロ棋士は、ponanzaに角落ちでも自信がないという。恐ろしい時代になったものである。

さらにアルファ碁ゼロは、1つのニューラルネットワークしか使わないなど、アルゴリズムを合理化しており、そのためGPUより30倍速いというTPUチップを、4個使うだけでよい。

要するにこれは、アルファ碁開発で培ったノウハウを集大成した強化学習マシンなのだった。強化学習、すなわち教師なし学習なのだから、人間の棋譜など、事前に用意する必要はないということになる。

ただ、だからといって最初から人間の棋譜など不要とはいえない。なぜなら、人間の棋譜を駆使した初期版があってこそここまで進化できたわけだから。一人でここまでこれたわけじゃないぞ、誰のお陰だと思っているんだとつい人間は言いたくなるだろう、勝てない悔し紛れに。

あと、創薬などさまざまな分野に応用されると期待されるというが、こういう手法は有効なだけに逆にかなり分野を選ぶと思う。

ともかく私の当面の興味は、次のとおりである。

  1. この手法での囲碁ソフトの強さの上限はどこまでか
  2. 将棋にも強化学習は使えるか

なんかウェブの情報で、Wifiのセキュリティ・ホールがどうのとか、情報を見て、一方でマイクロソフトがそれの対応のセキュリティ・パッチを作成したとかウェブにあったので、これはWindows Updateをかけなくてはと焦った。

焦っても仕方ないのだが、Windows Updateは先週終わったばかりなので、最早そんなにたくさんこないと高をくくった。ところが、もともとWindows 10のWindows Updateは重いのだけれども、それにしても重すぎる。二台ある自宅のそれぞれのWindows 10パソコンで、各々3時間以上かかった。

なんでそんなにかかるのかと後で調べたら、これは今年の春ごろから始まったクリエーターズ・アップデートの秋版で、Fall Creators Updateというらしい。

そんなの早く言ってよ、と思ったのだが、事前にウェブで調べたら簡単に分かったことなので、私の怠慢である。ともかくこれはWifiのセキュリティ・ホールとは関係ないらしい。

あと、自宅のWindows 10パソコンは、私が使っているLenovoと家内が使っているAcerがあるが、Acerの方でFall Creators Updateでエラーが発生して、前の版のWindowsに戻すとメッセージがでた。ええっ、Creators Updateが導入できなかったのかと怪訝になった。

Creators Updateが導入できなかった原因を調べたら、Acerのパソコンで、ウイルス・チェックのプログラムがウイルスバスターで、それだとFall Creators Updateがエラーになることがあるらしい。これを修正するプログラムは10月20日にトレンドマイクロが配布するらしいので、それの対応が済んでから、Fall Creators Updateを再導入することにした。

それにしてもFall Creators Updateは導入に3時間以上もかかってしまった。それでいろいろ新機能があるらしいのだが、そういうのに全く興味がなく従来どおりの機能を使い続ける私もどうかと自分では思うのだが、まあ仕方がない。

「コンピュータによる計算」というサブジェクトでブログ記事を書こうとしているのだが、これほど、何がいいたいの?と曖昧な疑問を呈させるサブジェクトもないので、説明する。

すなわち、最近、ポナンザ囲碁AI新時代など、将棋AIや囲碁AIが強くなって人間が勝てないという議論がよく行われているが、私はつい、そうはいうけど、もともとコンピュータは人間に比べて化け物のような計算量を誇るので、将棋AIや囲碁AIの人間の負かし方は相当手ぬるいと思ってしまう。

例えば、Lucas-Lehmer判定法であるが、Lucasはほぼ一生を費やして手計算で、2127-1がメルセンヌ素数であることを発見したが、それが手計算の限界で、次の2521-1は、それから70年以上かかってコンピュータを使うことで発見された。もし2521-1を手計算でLucas-Lehmer判定により素数であることを発見しようとしたら、もしかして1000年くらいかかるかもしれない。しかし、私が使っているパソコンでも、その計算にかかる時間はせいぜい10分くらいで、その差は2000万倍程度である。

もしかして、21000-1のコラッツ数列の計算なら、まだしもその差は4万倍程度で、それほど大差ではないかもしれない。

それではこれならどうだろう、すなわち、3体問題のルンゲクッタの数値計算を人間が手計算すると考えると、Lucas-Lehmer判定やコラッツ数列と違って、平方根の計算も含み、1ステップだけでも下手したらまる一日くらいかかりそうな面倒な浮動小数点計算を少なくとも100万ステップは計算しなくては意味がなく、それは発狂的とさえいえる。

これがナビエストークスのような流体力学の偏微分方程式の数値計算となると、発狂的の累乗で、尻尾を巻いて逃げるよりない。

私がいいたいことは、将棋AIや囲碁AIは相当に人間に近い土俵で、コンピュータが戦っているのだというただけそれだけである。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちコンピュータカテゴリに属しているものが含まれています。

次のカテゴリはスピリチュアルです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。