X



【オセロ,将棋】ボードゲーム【囲碁,War】
レス数が1000を超えています。これ以上書き込みはできません。
0001名前は開発中のものです。垢版03/07/10 00:10ID:6FQp6G+O
比較的地味なボードゲーム専用のスレが欲しくて立ててみました。

私はc言語で作ったデータベースを使って人間と対戦できる将棋かチェス
みたいなソフトを作りたいと思ってますが、グラフィックインターフェースの
作り方がわからなくてつっかえているレベルです。
0002名前は開発中のものです。垢版03/07/10 00:46ID:c+Tl/JM7
>>1
まずユーザインタフェースは、テキストベースで作れ。
盤面を表示して、指す座標をひとつずつ入力させるタイプ。
AIのテストなら、それくらいで十分だろ。
0003名前は開発中のものです。垢版03/07/10 00:48ID:c+Tl/JM7
もうひとつ逝っておくと、「私は云々」みたいなことは、>>1に書くべきではないな。
単発質問スレだとおもわれるぞ?(もし真性単発質問スレだったらスマソw)
0004名前は開発中のものです。垢版03/07/10 06:47ID:ZYbxAUmJ
ありがとうございます。単発というわけでなく話題提供のつもりでしたが
まぎらわしかったですね。すみません。ボードゲームに関するいかなる
話題でも参考になるのでそういう風に解釈してください。
あと2でいわれたテキストベースというのは具体的にどのようなことを
すればいいのかもう少し詳しく教えてくださいませんか。当方c言語を
はじめて一ヶ月。BCCだけでとりあえず思考ルーチンだけはめどが
たってきた程度で表示はまったくの素人なのです。
0009垢版03/07/11 02:32ID:tBkU7GoV
ミニゲームなのであらゆる可能なポジションに対しそれが最善で
何手で詰むかまたは引き分け(ドロー)かの情報を得ることができますので
それを一度作ってデータベースとしてそれを参照しながら(数MBになる予定)
次の一手を考えるようにしたいと思ってます。まだ途中ですが。
0010名前は開発中のものです。垢版03/07/11 03:08ID:h6ee7c7G
>>1
Cのコンソールでやるなら、オセロ、囲碁なら、●〇+で
将棋は歩v等か外字エディタとか。僕は今時間が空いているので、
コンソール×外字エディタの将棋をウインアプリに作り直している。
Win32APIにCreateFont関数があるから、それで逆の文字も表示できる。
一番良いのはやっぱりビットマップを用意して表示する。

参考に7行プログラミングで作られたもの。Cコンソール。
http://pc.2ch.net/test/read.cgi/tech/984182993/372

#include <stdio.h>
int*i,p,t,a,d,v,m[91]={-10,-9,-8,-1,1,8,9,10},s;void k(){if(m[p]==0)for(i=m;*i
;i++){for(v=p+*i;m[v]==9-t;v+=*i);if(v-p-*i&&m[v]==t&&(s=a=v=p,d))do m[v]=t,v
+=*i;while(m[v]-t);}}main(){for(m[40]=m[50]=s=t=3,m[41]=m[49]=6;s-1;a=d=0){for
(p=8;++p<82;printf("・\0○\0●\0\n"+m[p]))p%9?k():m[p]=9;for(a?d=a=p=9:s?s=0,
puts("pass"):s++;a==9;k())t-6?scanf("%d%d",&p,&v),p+=v*9:++p;t=9-t;}return 0;}

>>2さんが言っているような感じ。思考ルーチンができるなら、
めちゃ強いのを作ってから、グラフィカルなのに入っても遅くない。
0011名前は開発中のものです。垢版03/07/11 11:04ID:JYguR8yG
いきなり7行オセロかよ!初心者にはつらそう。
まぁ、適当にサンプルを書いておこう。
syouhai_hantei()
cpu_no_sikou_routine()
の二つの関数さえ書けば、完璧な囲碁ソフトだぜ!

ちなみに、↓は囲碁だけどbanmen,koma,syohaiを変えれば、将棋でもチェスでも同じ。
------------------
int banmen[19][19] = {{0}}; /* ←グローバル変数 */
char *koma[] = {"+", "●", "○"};
char *syohai[] = {"", "●の勝ちです", "○の勝ちです", "引き分けです"};
int i, j, r;
while (1) {
  for (i = 0; i < 19; i++) {
    for (j = 0; j < 19; j++) {
      printf("%s", koma[banmen[i][j]]);
    }
    printf("\n");
  }
0012続き垢版03/07/11 11:05ID:JYguR8yG
  do {
    printf("縦?\n");
    scanf("%d", &i);
    printf("横?\n");
    scanf("%d", &j);
  } while(i < 0 || i >= 19 || j < 0 || j >= 19);
  banmen[i][j] = 1;
  r = syouhai_hantei();
  if (r != 0)
    break;
  cpu_no_sikou_routine(&i, &j);
  banmen[i][j] = 1;
  r = syouhai_hantei();
  if (r != 0)
    break;
}
printf("%sの勝ちです。", syohai[r]);
0013間違い垢版03/07/11 11:06ID:JYguR8yG

  cpu_no_sikou_routine(&i, &j);
  banmen[i][j] = 2;
だった。ごめ。
0015名前は開発中のものです。垢版03/07/24 15:23ID:WvOHnIpg
放置されてるスレなんで上げてみた。
いいんじゃね、東大将棋とかがどうかしましたかって言うのは無理だけど
なんか作りたいね。
0017名前は開発中のものです。垢版03/07/24 16:03ID:xMvniY6D
http://www.39001.com/cgi-bin/cpc/gateway.cgi?id=ookazujp
http://www.39001.com/cgi-bin/cpc/welcome.cgi?id=ookazujp
http://www.bannerbridge.net/cgi-bin/click.cgi?mid=b000000002&pid=p000000244
http://www.bannerbridge.net/cgi-bin/click.cgi?mid=b000000003&pid=p000000244
http://www.bannerbridge.net/cgi-bin/click.cgi?mid=b000000017&pid=p000000244
http://www.adultshoping.com/index.cgi?id=1057809839
http://www.bannerbridge.net/cgi-bin/click.cgi?mid=b000000008&pid=p000000244

!!!!! ━━━━━━(゚∀゚)b━━━━━━ グッジョブ!!!!!
0019名前は開発中のものです。垢版03/07/29 07:57ID:g9GIpNGm
1より森田さんはどうなったの?
002020垢版03/09/27 13:02ID:BQIe1Jzq
JAVA、将棋、行ってみます。
方針は、1億局指す、すべての局面の勝率を記憶する。

public class example3{
public static void main(String arg[]){
//
int banmen[][] = new int[9][9];
char koma[] = {'+','F','O','+','f','o'};
String syohai[] = {" ","先手の勝ちです","後手の勝ちです","引き分けです"};
int i, j, r;
banmen[0][4]=5;banmen[2][4]=4;
banmen[6][4]=1;
banmen[8][4]=2;

{
for (i = 0; i < 9; i=i+1) {
for (j = 0; j < 9; j=j+1) {
System.out.print(koma[banmen[i][j]]);
}
System.out.print("\n");
}
}
}
}

0021あぼーん垢版03/09/27 13:19ID:V9CFc5A8
あぼーん
002220垢版03/09/27 14:53ID:BQIe1Jzq
歩、香車、桂馬、銀、金、角、飛車、王、と金、成り香、成り桂、成り銀、竜馬、竜
pawn,lance,night,silver,gold,bishop,rook,oh,Tokin,yari,narikeiMa,argent,dragonHorse,dragon
で行く。

lnsgogsnl
.r.....b.
ppppppppp
.........
.........
.........
PPPPPPPPP
.B.....R.
LNSGOGSNL
0024_垢版03/09/27 15:38ID:8HTp6N1L
  ∋8ノノハ.∩   http://endou2.kir.jp/hankaku11.html#.2ch.net
   川o・-・)ノ <先生!こんなのがありました!
http://endou2.kir.jp/hankaku04.html#.2ch.net
http://endou2.kir.jp/hankaku03.html#.2ch.net
http://endou2.kir.jp/hankaku10.html#.2ch.net
http://endou2.kir.jp/hankaku05.html#.2ch.net
http://endou2.kir.jp/hankaku08.html#.2ch.net
http://endou2.kir.jp/hankaku07.html#.2ch.net
http://endou2.kir.jp/hankaku01.html#.2ch.net
http://endou2.kir.jp/hankaku06.html#.2ch.net
http://endou2.kir.jp/hankaku02.html#.2ch.net
http://endou2.kir.jp/hankaku09.html#.2ch.net
002520垢版03/09/27 15:56ID:BQIe1Jzq
>>23
もち、ろん、です。

名人が最善手と次善手しか指さないと仮定すれば、1兆局面を用意
すれば、80手まではOKになる。あとは森田将棋に頼む。
よもや3善手を指すような事はあるまいが、そのときは灯台将棋に引き継ぐ。
002720垢版03/09/27 20:58ID:BQIe1Jzq
public class example3{
public static void main(String arg[]){
int banmen[][] = {
{2,3,4,5,8,5,4,3,2},
{0,7,0,0,0,0,0,6,0},
{1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{10,10,10,10,10,10,10,10,10},
{0,15,0,0,0,0,0,16,0},
{11,12,13,14,17,14,13,12,11}};
char koma[] = {'.','f','y','m','s','g','k','h','o',
'.','P','Y','M','S','G','K','H','O'};
String syohai[] = {" ","先手の勝ちです","後手の勝ちです","引き分けです"};
int i, j, r;

{
for (i = 0; i < 9; i=i+1) {
for (j = 0; j < 9; j=j+1) {
System.out.print(koma[banmen[i][j]]);
}
System.out.print("\n");
}}}}
0028名前は開発中のものです。垢版03/09/28 11:11ID:yU8F/DmP
>>20さん
22の見ると、なんか将棋は素人っぽくてワロタ(悪い意味ではないです)


駒をテキスト表示するなら一文字で下記を使うと良いかも(下段は成り駒)

飛、角、歩、香、桂、銀、金、玉
竜、馬、个、仝、今、全
002920垢版03/09/28 12:58ID:JqB40bUM
>>28
はじめて見るアイディアで参考になります。色携帯、アジアスタンダードには良いかもしれない。
敵方表現で4バイトは必要?
当方、敵駒含めても1バイトで表現したいので、大文字先手、小文字後手、
日本語成らず、英語(フランス語)成り、で。 改定版は
fymsgokh,plnagobr
チェス屋含めてインターナショナル。
003020垢版03/09/28 14:42ID:JqB40bUM
試しに76歩、77歩を10億回まわして見た。P4、2.4Gで約10秒。
結構速いね。秒速100万手も夢ではない。 (劇刺で数十万手らしい)

'fymsgokh'は「フィムスゴコホ」と読む。タバコを吸うとスゴく咳き込む。

public class example3{
public static void main(String arg[]){
int banmen[][] = {
{2,3,4,5,8,5,4,3,2},
{0,7,0,0,0,0,0,6,0},
{1,1,1,1,1,1,1,1,1},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{17,17,17,17,17,17,17,17,17},
{0,22,0,0,0,0,0,23,0},
{18,19,20,21,24,21,20,19,18}};
char koma[] = {'.','f','y','m','s','g','k','h','o','p','l','n','a','g','b','r',
'.','F','Y','M','S','G','K','H','O','P','L','N','A','G','B','R'};
long i, j, r;

for (i=0;i<1000000000;i=i+1){
banmen[6][2]=0;
banmen[7][2]=17;

banmen[7][2]=0;
banmen[6][2]=17;
}
}}
0031局面表示垢版03/09/28 21:45ID:JqB40bUM
初期面:
's00000000000000ymsgogsmy1h5k1fffffffff999FFFFFFFFF1K5H1YMSGOGSMY'
この派板にチェスはなかったのか。



0033持ち時間100万分の1秒垢版03/09/30 21:30ID:gZv5839q
困らないか、盤上の駒数を計算すれば、足りないものが持ち駒。
0S5210y4o1my1y2gs1g1f4f1ff4s1f4bm2F3F2FS3F2G1F2F2S3H2YMOG3MY
0:平手
S:つぎ、先手番
5:先手持ち歩5
2:後手持ち歩2
1:先手持ち角1
0:後手持ち角0

任意の局面から、100万分の1秒以内で合法的な手を指したい。
200行から400行のプログラムで達成できればなんとかなるか。

9一に自分の駒があるか
8一に、、、、、

3五に自駒あるか、yes
  自駒は前にひとつ進めるか、yes
  進む先は盤内空枡または敵駒か、yes
候補手決定、return
0035名前は開発中のものです。垢版03/10/01 02:39ID:JUQLzkMt
>>34
 まあ、なんとなく"ymsgogsmy"は"香桂銀金王金銀桂香"であろうことはわかるのだが。
0036旧版垢版03/10/01 05:29ID:BGyx/9fV
>>34
2日古い旧版ですが、
"S0000000000000000"
S:次の手番、先手
00:先手持ち歩
000000:先手その他持ち駒の数
00:後手持ち歩
000000:後手持ち駒
小文字英字:後手盤上駒
大文字英字:先手盤上駒
数字:連続空枡の数
のつもりでしたが、持ち駒については、盤上に足りないものだけを
表示すればよいことにした。
「何手目まで指したか」の情報も入れたほうが良いかな。
チェスプログラマからのアイディアですが、あちらは持ち駒がない。
003734垢版03/10/01 20:24ID:IcaM+bMd
>36
なるほどあの文字列はそういう風にゲームの状態を表していたんですね。
当方将棋やチェスのプログラムを組んだことがないのでよくわかりませんが
初期状態としてプログラムを実行するときの引数などに与えれば、テストを
行ったり詰将棋を解かせたりするときに便利そうですね。
ただちょっと人間が読むにはちょっと読みにくい形式なので、例えば次のような
感じにセパレータをいれてみたりして読みやすくしてはどうでしょうか?
先手番:00000000:00000000:ymsgogsmy/1h5k1/fffffffff/9/9/9/FFFFFFFFF/1K5H1/YMSGOGSMY
003820ふたまた垢版03/10/01 21:22ID:BGyx/9fV
>>37
人間にもコンピュータにもと「ふたまた」をかけたものです。
気にかけていただき恐れ入ります。
2台のPC間の通信、局面データを保存するときのキーなどを想定しています。
ちなみに>>33
'平手先手番:52:10:y4o1my/1y2gs1g1/f4f1ff/4s1f2/2bm2F2/1F2FS3/F2G1F2F/2S3H2/YMOG3MY'は
後手持ち駒:歩2
y・・・・o・my
・y・・gs・g・
f・・・・f・ff
・・・・s・f・・
・・bm・・歩・・
・歩・・歩銀・・・
歩・・金・歩・・歩
・・銀・・・飛・・
香桂王金・・・桂香
先手持ち駒:角1歩5

003920うまく出ない垢版03/10/01 21:49ID:BGyx/9fV
∨香 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨王 ̄ ̄∨桂∨香  後手:歩2
 ̄ ̄∨香 ̄ ̄ ̄ ̄∨金∨銀 ̄ ̄∨金 ̄ ̄
∨歩 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨歩 ̄ ̄∨歩∨歩
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨銀 ̄ ̄∨歩 ̄ ̄ ̄ ̄
 ̄ ̄ ̄ ̄∨馬∨桂 ̄ ̄ ̄ ̄∧歩 ̄ ̄ ̄ ̄
 ̄ ̄∧歩 ̄ ̄ ̄ ̄∧歩∧銀 ̄ ̄ ̄ ̄ ̄ ̄
∧歩 ̄ ̄ ̄ ̄∧金 ̄ ̄∧歩 ̄ ̄ ̄ ̄∧歩
 ̄ ̄ ̄ ̄∧銀 ̄ ̄ ̄ ̄ ̄ ̄∧飛 ̄ ̄ ̄ ̄
∧香∧桂∧王∧金 ̄ ̄ ̄ ̄ ̄ ̄∧桂∧香  先手:角歩2


0042 ◆R/rLuLKeEI 垢版03/10/03 22:14ID:6g0/L3Ad
>>40
頑張ってますよ。
0043データーベース垢版03/10/05 23:34ID:WQ0kK/U9
>>1
>c言語で作ったデータベースを使って人間と対戦できる将棋かチェス

データーベースはC,JAVA無関係なので、作りましょう。
まずは先手、機械、19手まで。
1:76歩
3:
14歩:xxx;24歩:xxx;34歩:xxx;44歩:xxx;
54歩:xxx;64歩:xxx;74歩:xxx;84歩:xxx;
94歩:xxx;32銀:xxx;42銀:xxx;32金:xxx;
42金:xxx;52金左:xxx;42玉:xxx;52玉:xxx;
......


0044データーベース垢版03/10/06 21:37ID:u0x9oIcm
1手目は76歩:77760
3手目は後手指手にかかわらず26歩:27260
13140:27260
23240:27260
33340:27260
...
91920:27260
5手目
13140,14150:26250
...
33340,53540:39480
33340,41320:69780
...
0045データーベース垢版03/10/07 20:56ID:ViuviOpc
1手目、3手目、コンピュータがいつも同じ手では面白くない。
1手目:30
2手目:30
3手目:8
4手目:26
5手目:4
6手目:16
7手目:2
8手目:12
9手目:2
10手目:8
.....
位が適当か、
0046データーベース垢版03/10/07 21:19ID:ViuviOpc
30*30*8*26*4*16*2*12*2*8=40,0062,7200 すでに46億か、無理だ。
30*30*4*16*2*8*2*4*1*2=1474,5600 15百万、この程度か。
あと50手を先手1手、後手2手で、32百万、掛けると、
472兆、ちょっと苦しい。
8*30*2*16*1*8*1*4*1*2=491520 、30分の一になった。
16兆。 これで60手までOK
機械でうまくはじき出せるか。
0047無理垢版03/10/09 03:57ID:G6zbUIk0
相手の手を2手用意したのでは、すぐに定跡から外れて役に立たないか。
4手まで用意で、40手までで、1兆。
0048名前は開発中のものです。垢版03/10/09 10:04ID:RyMlJxaL
コンピューターの将棋は、終盤はプロ並の寄せをするようになったが
序盤から中盤はイマイチだからねぇ。
0049名前は開発中のものです。垢版03/10/09 21:34ID:LCLj7mCa
40手目まで先手後手5分の将棋を、コンピュータと強い人間が引き継いで指せば、人間勝利は当然。
では、130手で終局した互角の名勝負を、現在の最強ソフトと最強人間で指し継ぐとすれば、何手目くらいからが、良い勝負になるでしょう。
0050名前は開発中のものです。垢版03/10/11 01:31ID:KnVdGg3r
>>49
ま、言いたい事は大体分かるけど、もっと分かりやすい日本語使おうな(5分→互角)
ってか文章の最後のほうなんて、とても日本人とは思えんぞ。

あんまり将棋が指せない(棋力が低い)人なんだろうけど、
「40手目まで指し終わり、その状況がほぼ互角」ってのは、そうそうないと思うし、
お互いにプロ並の棋力があっても、なかなか互角だと断言できないだろうから難しいよ。

130手というと終盤の状況だろうし、その時点でもマァマァ長手数の部類になるから
「優劣なし、互角」と断言ができずに無理っぽい。
(矛盾してるっぽいが、もし本当に互角の状況なら手番があるほうが有利になる場合が多いのでは)
0051名前は開発中のものです。垢版03/10/11 11:00ID:K9b3BQSh
//www.colina.demon.co.uk/chu.html.
中将棋のソースがあった。

if timeRemaining == 60000 then do -- byo yomi
basicTime=sp.getByoYomiTime() -- 13 seconds - cautious
maximumTime=55 -- leaves 5 seconds in which to actually make the move
end



if abbrev.equals(String "P") then return "Pawn"
else if abbrev.equals("+P") then return "Tokin"
else if abbrev.equals(String "K") then return "King"
else if abbrev.equals(String "L") then return "Lance"
else if abbrev.equals(String "S") then return "Silver General"
else if abbrev.equals(String "G") then return "Gold General"
else if abbrev.equals(String "B") then return "Bishop"
else if abbrev.equals(String "R") then return "Rook"
0052BitSet垢版03/10/12 16:55ID:vJq46n+e
JavaにBitSetクラスというものがあるのを偶然見つけた。
81枡での駒の存非をビットで表現するのに便利そう。
0053名前は開発中のものです。垢版03/10/18 00:28ID:fl0E31RS
やさしいチェスプログラムがあった。
これを焼きなおして見よう。

//build start position
int [] org = {
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
99,124, 22, 23, 25,126, 23, 22,124, 99,
99, 21, 21, 21, 21, 21, 21, 21, 21, 99,
99, 00, 00, 00, 00, 00, 00, 00, 00, 99,
99, 00, 00, 00, 00, 00, 00, 00, 00, 99,
99, 00, 00, 00, 00, 00, 00, 00, 00, 99,
99, 00, 00, 00, 00, 00, 00, 00, 00, 99,
99, 11, 11, 11, 11, 11, 11, 11, 11, 99,
99,114, 12, 13, 15,116, 13, 12,114, 99,
99, 99, 99, 99, 99, 99, 99, 99, 99, 99,
99, 99, 99, 99, 99, 99, 99, 99, 99, 99 };

for (int i=0; i < 120; i++)
board [i] = org [i];

//update screen
repaint ();
0054名前は開発中のものです。垢版03/10/24 13:59ID:B1JCysav
>>36
後手盤上駒、先手盤上駒の順に分けると:
'0S:lnsgkgsnl/1r5b1/ppppppppp/108/ppppppppp/1b5r1/lnsgkgsnl'

'0S5210:l4k1nl/1r2gs1g1/p4p1pp4s1p/4Bn/83/p3p2ps3/p2g1p2p/2s3r2/lnkg3nl'
左上隅から順に81枡で後手駒終わり、次先手駒。大文字は成り。
文字の種類が少なくなってすっきりした。

>>38、39  8二香は誤り、8二飛
>>30 banmen[7][2]=17;は誤り、banmen[5][2]=17;




0055名前は開発中のものです。垢版03/10/24 14:22ID:B1JCysav
大文字と小文字を逆にして見た。
'0S5210:L4K1Nl/1R2GS1G1/F4F1FF/4S1F4bN/83/F3F2FS3/F2G1F2F/2S3R2/LNKG3NL'
「0S5210:香4王1桂香/1飛2金銀1金1/歩4歩1歩歩/4銀1歩2/2馬桂
/83/歩2/1歩2歩銀3/歩2金1歩2歩/2銀3飛2/香桂王金3桂香」
0056名前は開発中のものです。垢版03/10/25 21:28ID:X5VuBDRK
一兆と一口に言っても1秒で1局面を評価結論出して行って3万年かかる。
10000,0000,0000/60/60/24/365.25=31688.08781
0057名前は開発中のものです。垢版03/10/27 23:32ID:94uElLdI
まずは盤が必要。
9x9
11x11
16x16
どれが良いか。9x10を延長して13x10+1にしよう。
なぜプラス1か?

99,99,99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,99,99,
99,18,19,20,21,24,21,20,19,18,
99,00,23,00,00,00,00,00,22,00,
99,17,17,17,17,17,17,17,17,17,
....
....
99,99,99,99,99,99,99,99,99,99,
99,99,99,99,99,99,99,99,99,99,99
のような感じ。99より48が良いか。
11x11の採用者は1列無駄だよね。チェスじゃないから
桂馬は横に飛ばないのに。
0058名前は開発中のものです。垢版03/10/31 15:46ID:X+ZKdv/s
発見!! 64JAVA
J2SE Itanium v 1.4.2_02 のダウンロード
でも、ハードとOSの値段は??  あ、OSはRedHatでも良いか。
0060名前は開発中のものです。垢版03/12/10 04:37ID:Sw46xuo+
案1:
人間とプログラムが対戦する際、
人間側の選択肢を「2択」データベースで用意する。
例えば人間初手なら:
1:76歩
2:26歩
3:投了
その他の手は選択不可とする。
プログラム側の対応手を1手用意する。
初手より70手までで320億応手。
70手終了時点で、
歩:1点、小駒:2点、大駒:10点で集計。得点多いほうが勝ち。
これなら全ての手をゼロ秒で送り出せる。 遊べると思います?
0063名前は開発中のものです。垢版03/12/12 21:25ID:fBTD6+Y3
申し訳ない。へぼプログラムの考える最善2手だから、ロクな手では無いとおもわれ、
まずは携帯用ストレス解消用。ナズケテ「ストレス将棋」
0064名前は開発中のものです。垢版03/12/12 21:58ID:fBTD6+Y3
序盤34手まで、13万通り、は過去局CDROMから頻出手を選ぶ。
以降は1局面あたり、プログラムで1000秒思考した結果最善2手を保存する。
PC1台で1314.9局面/年。1000台のPCにお願いして、131万局面。
約40手先、合計で74手まで用意できる。
コンピュータの考えた次善手をたどると実は人間側の勝ちになったりする?。

0065名前は開発中のものです。垢版03/12/12 22:09ID:fBTD6+Y3
計算違いだ。34手目までは、過去の名局ただ1局のみをベースにする必要がある。
もしくは、最新の流行1局。こちらだと1年先の保証がない
0067名前は開発中のものです。垢版03/12/13 04:54ID:FZIp2nQw
40手までの「2ちゃんボードゲーム板標準手順」を将棋の強い方に上げてもらおう。
その後の30手をDB作成する。まずは1秒思考版で。
0068名前は開発中のものです。垢版03/12/20 07:51ID:cJscYprH
1. 盤、Bang、 は取りあえず 9x9=81の一次元配列にしよう。
  あとで変更するかも知れない。
2. 駒、 こちらも適当に、
   先手歩:16、先手香車:17、後手歩:32、、
3. generateArandomMove()
乱数で合法手を1手作成して返す。 

4.何局か指して、勝率の良いもの選ぶ。

計画
1.詰め将棋、1手詰め
2.詰め将棋、3手詰め
3.詰め将棋、5手詰め
4、次の一手問題
5、2日制将棋1日目終了後指し継ぎ
6、序盤データベース



0069名前は開発中のものです。垢版03/12/20 13:55ID:cJscYprH
944422200
....K....
.........
....g....
.........
.........
.........
.........
.........
.........
000010000
1手詰め、持ち駒、金

ランダムに3手指し終了した時点で駒台に敵玉がのっていれば
勝ち、その他は負け。


0070名前は開発中のものです。垢版03/12/21 01:05ID:45Mhtaty
50万回試行した。結果は、、、、、、
41金:702
61金:727
42金:540
52金:663
62金:588
ちょっと予想と違う結果になった。

61金、62王、のあと9分の2の確率で王を取る。
52金、61王、のあと10分の1の確率で王が駒台にのる。
とりあえず理屈には合って居そう。
「逃げる」「取る」手を覚えさせれば、なんとかなりそう。

次の1手詰めをやってみよう
844322100
.........
......G..
.........
......dsK
........G
.........
.........
.........
.........
000000000
持ち駒無し

0071名前は開発中のものです。垢版03/12/21 05:05ID:45Mhtaty
>>70
61金で41王に逃げる確率は5百数十分の一、
王が移動しなければ、9分の一で、王確保。
52金後、王が移動しないと10分の一で王捕獲される。
「取る」プログラムが「逃げる」よりは簡単そう。
あと何を工夫するか。
王手をチェックすれば、大幅に高速になるのは「見え」てるが、指し将棋の
強化には約に立たないから後回し。

次の1手詰めは50万回では差が出ない、500万回、朝までかかる。
0072名前は開発中のものです。垢版03/12/21 07:48ID:45Mhtaty
>>70
10万回で
23銀不成り:468
23銀成り:341
35銀:245
少しはずしているが、まあ、近い。敵玉が逃げない場合も含めての敵玉捕獲確率のようなもの。
一気に次の1手問題。
601000000
LKS.....L
..S.r....
....B..PP
.PpG.....
P.P....p.
p.Nng.p.p
kpn..p.r.
..g......
l....B..l
000012000 持ち駒金銀2、(95歩まで) 500万回

先手生駒:plnsgbrk 先手成り駒:tycagmd
英語圏でも将棋プログラムを開発しているから、あまり外れないほうが良いか。(少なくとも生駒)

桂馬の「桂」は何の意味があるのだろう。金銀さんご、、、、、、などの言葉があるから、「珊瑚」に関係ないのかなーー。それで、 coral にしてみた。大外れかもしれない。



0073名前は開発中のものです。垢版03/12/21 13:28ID:45Mhtaty
500万回で最頻手は92銀:5883回。
お目当ての手は第16位で1739回。 約150の可能手の内。
終盤なので、玉の防御をすれば、もう少し良くなるか。

0074名前は開発中のものです。垢版03/12/21 13:46ID:45Mhtaty
中盤の問題。 100万回。

400100000
LN...G.NL
......SK.
P........
..PBPR.P.
.P.P..P.P
p.pN.p...
.pb.pg.rp
......s..
ln...g.kl
000011000
0076名前は開発中のものです。垢版03/12/26 09:45ID:HKWQqeik
中盤問題は本の正解とは異なる66角。それでも某ソフトと同じ。
もっと序盤問題から:

000000000
LN・GKGSNL
・R・S・・・B・
P・PPPP・PP
・P・・・・P・・
・・・・・・・・・
・・歩歩・・・・・
歩歩・・歩歩歩歩歩
・角・・・・・飛・
香桂銀金玉金銀桂香
000000000
先後逆
先生の正解は68飛だが、、、

とりあえず、王の防御だけは入れた。20回に1回防御しない、そのとき駒台に上げられる。つみ判定しなくて良いから省力
0079名前は開発中のものです。垢版03/12/27 13:03ID:7bL+N0Ad
>>76
あまり序盤すぎて、どうにもならない。65歩と68飛が嫌われた手。
王が動くのが好まれて居る、が、
可能な局面の数と、乱数そのものの数に圧倒的な差があるので、乱数の偏りを見ているのかもしれない。
もう少し局面を進めて見よう。

000000000
LN・・・GBNL
・R・・G・S・・
P・・P・・SK・
・・P・PPPP・
・P・歩・・・・P
歩・歩・銀歩歩歩・
・歩角・歩・桂・歩
・・・飛金・銀玉・
香桂・・・金・・香
000000000
200万回、嫌われた手:75歩:−236点
推奨手:25歩:1189点、45銀:637点、29玉:532点
どうなんでしょうか。先生推薦手は別の手。


0080名前は開発中のものです。垢版03/12/28 08:37ID:Yv24cf1G
全然駄目だ。25歩は確率的に取って来ない、24歩、20回に1回逃げない、敵玉捕獲確率が高い。
45銀も同じ、34銀、高確率敵玉捕獲。
相手が悪い手を指してこちらが勝ったとき、相手が良い手を指してこちらが勝ったときで、同じ1勝ではdame.
改善!
0081名前は開発中のものです。垢版03/12/28 14:04ID:Yv24cf1G
先手第1手目が10000勝10000敗とする。
第2手目が後手側100勝1敗の手で、この対局に先手が勝った場合:
100点与える。
負けた場合:1点引く。 やってみよう。
0084名前は開発中のものです。垢版04/01/04 21:35ID:03xOK9CB
休みは終わり、バグとりまずまず、局面で勝った手を再使用。
秒速約5000手。1000倍速必要。次の課題はキラー手の採用。
特定手の生成、王手、取る手、逃げる手、成る手、を高速に生成したい。
0085名前は開発中のものです。垢版04/01/06 08:44ID:IKcYlSoc
詰め将棋に限って言えば、詰んだ王将の位置を想定して
その逆順で手を考えるってパターンもありかもしれないと想像。
完全に詰んだ形でしかも持ち駒無しっていうかなり限定された状況だし
自分が詰め将棋考えるときにそうしてるから。
0086名前は開発中のものです。垢版04/01/06 22:37ID:wn4SZTXn
「想定」はコンピュータの不得意科目だから難しそう。
詰め将棋に関しては、現在ソフトは人間を超えてる模様。後発組はなかなか追いつけない。
序盤はすごく弱いとの評判だから、、、なんとか、、、 序盤で差をつけてそのまま、、、
0087名前は開発中のものです。垢版04/01/24 12:15ID:65yd+7L7
いまのところ、あまりうまくいってない。バグなのか、、

ある新出局面が与えられる: 可能な指し手は200.そのうち190手以上が凡手。
全手試すと時間が足りない。如何に良い候補手を選ぶか、、  取る成るとか言っているとまた時間がかかる。
局面から何手目かの別に成功(killer)手を集積しようか。
手目別キラー勝率順、、、  どう?

みんな、序盤がだめって言ってる、、、  
008920垢版04/01/25 11:27ID:4RpPXlNl
おーっ援護だー、有り難い。100まで行くのに半年、1000までいけるかな、新スレッドの立て方知らないし、心配ないか。

0090ボドゲー20垢版04/01/26 05:16ID:ev0kjgo0
負けてるくせに、手を変えないバグ発見。ゆっくりなおそう。
乱数将棋の強さをゼロとして、C将棋の強さ標準を作成することが可能。
2枚落ちで勝率5割なら600点、それにまた2枚落ち5割で1200点、、、、
絶対零度のようなもの、、、ケルビンじゃなく、ボドゲー8000点とかで呼んでください。
うちの特許じゃよ!


【香 落】100点
  【角 落】250点
  【飛 落】350点
  【飛香落】450点
  【二枚落】600点
0091名前は開発中のものです。垢版04/01/30 10:12ID:LC61jD25
6手まで指し終った段階で一歩でも取られていれば負け。
76、34、26,84、66は66同角で先手負け。
0092名前は開発中のものです。垢版04/01/30 11:08ID:LC61jD25
n手まで将棋:n手まで指し終わり駒損の方が負け。
n=6:
76,14,56,13角、78銀、
n=8:
0093名前は開発中のものです。垢版04/01/30 12:35ID:LC61jD25
データベース:
第1手目76歩、第3手目26歩として、第5手目を準備しよう。
約900手くらい。第7手目は3万手以上か。後手の全手に対応。
0094名前は開発中のものです。垢版04/01/30 22:16ID:LC61jD25
グッドニュース:ひと月ぶりのバグ取りでやっと3手詰めが解けた。
5万局あまりの試行で発見。攻め手は王手に限ってないので、もち駒ありだとどこでも打って試す。29飛車とか

30万手程度だから、高速プログラムなら1秒以内か。とりあえず、というとこか。
30分程度かかった。秒速200手、デバッグ付きだから。

000000000
・・・・・・・・・
・・・・S・・・・
・・・N・銀K・P
・・・飛・・・・・
・・・・・・・・・
・・・・・・・・・
・・・・・・・・・
・・・・・・・・・
・・・・・・・・・
001010000
飛金
0095名前は開発中のものです。垢版04/01/30 23:24ID:LC61jD25
32金、
43玉、
33飛車、
31桂馬:20分の1の確率で王手を無視して自由に指す。それにしても玉を取り返す気か。
     20分の19はギブアップして決着する。
74飛車:王手を逃げないからと言って直ぐに取るとは限らない。あくまでも自由に。
95歩:玉将健在で後手の勝ち

次の問題
000000000
・・・・・・・・・
・・・・・・・・・
・・・・・・・・・
・・・・・・・・・
・・・・・・・・・
・・・・・・竜歩・
・・・・・歩歩・b    b=後手馬
・・・・・銀K・・
・・・・・・・桂香
001010000
飛金

0096名前は開発中のものです。垢版04/01/31 00:24ID:SCQw2gFE
>>95
×:玉を取り返す
○:玉を取られて、飛車を取り返す

後手後手言わんで玉方かな。

日本語でもこれだけバグが出る、、、
0097名前は開発中のものです。垢版04/02/01 20:27ID:AoEuxQTZ
コチコチコッチン、ボドゲーさん
................、動いてる
にーにの角と、はーちはちの角が
こんにちは、さようなら
ちくたくコッチン角交換

「最強」もり上がっているな、、、わが道を行く、、、
0098 ◆R/rLuLKeEI 垢版04/02/03 08:20ID:Oi0TsbpK
まずは頑張れー。

あまり盛り上がるとあちらでは板違いなりそう。
まだゲーム関連ではおまいら最強の2スレッドだけなんでいいが…
0099名前は開発中のものです。垢版04/02/03 21:03ID:TlBtJ5Aq
お、訪問者だ。誰も来ないと思って、のんきに替え歌なぞ歌って失礼しました。
ちらかっていますが、、
0100 ◆R/rLuLKeEI 垢版04/02/03 21:57ID:Oi0TsbpK
やっ、どもども、お構いなく。
いつもは読み込み専門でしたが、陽気な替え歌に誘われてつい。
また不意にお邪魔します。
0101名前は開発中のものです。垢版04/02/06 12:46ID:Kma2T1Ri
表示実験。
MSゴシックでOKだが、MSP(Proportional)だと表示がずれる。
<font color=red/>L
LNSGKGSNL
◇◇◇◇◇◇◇◇◇
PPPPPPPPP
◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◇◇◇◇
歩歩歩歩歩歩歩歩歩
◇角◇◇◇◇◇飛◇
香桂銀金王金銀桂香
0102名前は開発中のものです。垢版04/02/06 12:50ID:Kma2T1Ri
やはり英字はうまくいかない。「ツール、インターネットオプション、フォント、MSゴシック」
でお願いします。
0103名前は開発中のものです。垢版04/02/07 01:39ID:ye7xTN7i
>>95 の5手詰めがまだ解けない。バグを数個直した。このバグありでよく3手詰めが解けたものだ、と再度解かせてみたら7万回試行で解決。
5手を解くには、1,3,5,7手目が正答である必要がある。確率で行けば、1手目正解が160分の一、3手目が100分の一、5手目80、7手目、10として
1280万回に1回正解が出る。 現在、100分、42万局、秒速492手で進行中。
持ち駒のない問題が簡単か。 postが100を超えた。


0104名前は開発中のものです。垢版04/02/08 00:36ID:ZAi8NB51
相手の手の場合の数もあるので、正解に遭遇する確率はもっと小さい。
持ち駒が多い、飛車角が多いと難問となるので、新問題に変更。
000000000
◇◇◇◇◇角◇◇L
◇◇◇◇飛◇と◇◇
◇◇◇◇◇R◇K◇
◇◇◇B◇◇◇PP
◇◇◇◇◇◇歩◇◇
◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◇◇◇◇
◇◇◇◇◇◇◇◇◇
持ち駒なし
0105名前は開発中のものです。垢版04/02/08 14:27ID:BX3nFD2B
ふらりと寄ってみた。なんか色々頑張ってますな。

ここを見てふと思った。
詰め将棋って王の側の選択肢をどんどん少なくしていくゲームなんだよな。
最終的に選択肢が0で詰み。

つまり王が動く時に選択肢が少ない手を優先させれば
余計な探索は減るだろうと思った。
でもここのやり方とは違うから参考にはならんね。スマソ。
0106名前は開発中のものです。垢版04/02/08 14:53ID:ZAi8NB51
お立ちよりありがとうございます。といっても私のスレというわけではないが。
詰め将棋特化ならそれがいいらしい。今のところ、序盤プログラムのデバッグに詰め将棋を利用している。
そろそろ16時間になるが、100万局以上で結論が出ない。今夜半までには何とかなって欲しい。
それとは別に高速化と序盤DBでも考えよう。
0107 ◆R/rLuLKeEI 垢版04/02/08 16:14ID:t2AC4xnx
>>105
それは証明数による探索。脊尾詰。
0110名前は開発中のものです。垢版04/02/08 17:45ID:ZAi8NB51
21と、キタ−−,108万局疾走中。まだ勝率5割以下だが、あと11万局勝てば5割超。玉方の手がめまぐるしく変わる、、バタバタしている。
やったね。
0111名前は開発中のものです。垢版04/02/10 15:17ID:xmQGU8oL
RedHat9に付属の Iagno 2.2.0 なんだけど、レベル3でやると猛烈に時間が
かかる。(5手目辺り)3分くらい待っても打たないから終了させたけど、
せめて時間だけでもカウントして欲しい。PC側も思考中にカウントしてな
いとハングしたと思ってしまう。(もしかしてマジでハングか?) メール
しようと思ったけど英語できねーからここでちょっとグチ。。。
0113名前は開発中のものです。垢版04/07/28 16:27ID:r+zgac5E
史上初!!!
対局可能な大局将棋ソフトができました。
世界最大の将棋がプレーできます。
今どんどんアップデートされてます。
コンピューター同士の対局も可能。(数分で決着がつくw)

詳しくはここで
大局将棋を指しましょう2《第1局第2譜》
http://game6.2ch.net/test/read.cgi/bgame/1073993361/

0114名前は開発中のものです。垢版04/08/19 01:53ID:7LEsf4i7
Linuxで逆さの漢字を表示しようとすると地獄なんですけど、皆さんどうしてますか?
Xlib を使って強引に表示するという手もありますけど・・・・・・。
0118名前は開発中のものです。垢版04/08/19 04:01ID:7LEsf4i7
>>117
Windowsに移植したいのではなくて、Linux環境(の麻疹)のほうで実行・表示したいのですが・・・。

逆さ文字が駄目ならせめて、画像ファイル(データ)を読み込んで、
その画像をWindow上の任意の場所に表示できるだけでもいいです。
たったこれだけのことですが、表示するだけの方法ならいくらでもあるのですが、
Window領域(グラフィック領域)の任意の場所に表示となると、途端に方法が見つからなくなってしまいます。

思考ルーチンをCPUの速度で実行したいので、出来ればC言語でやりたいです。
こうなると、やはりX Windowを使うしかないのでしょうか・・・。
出来ないことはないですが・・・。
0119名前は開発中のものです。垢版04/08/19 04:16ID:k6q2f/Vl
>>118
移植とは関係ないよ。
LinuxとかXとかの理解に誤解があるんだろうけど、
勉強していけばそのうちわかるだろうからいいや。

画像なら画像で、Javaとパイプでつなぐもよし、Tcl/Tkを呼ぶもよし、
QtかwxWidgetsで少し本気にGUIプログラミングするもよし、好きにしたら。
0121名前は開発中のものです。垢版04/08/21 17:37ID:+7pTN+59
ttp://up.isp.2ch.net/up/79ab1d38086e.c
オセロゲームを作ってみました。C言語です。
テキストベースなので、どの環境でもコンパイル出来ると思います。
Windows環境のコマンドプロンプトで開発したので、漢字コードはS-JISになっています。
unixなどだと文字化けするかも知れません。

結構強いです。
0123名前は開発中のものです。垢版04/09/24 16:30:21ID:Wb26arGV
皆さん世界で一番強いチェスのAIを作り上げましょう。
typedef enum {B_KING  = -6,B_QUEEN = -5,B_ROOK = -4,B_BISHOP = -3,
B_KNIGHT = -2,B_PAWN = -1,NONE=0,
PAWN=1, KNIGHT=2, BISHOP=3, ROOK=4, QUEEN=5, KING=6} PieceT;

typedef enum {A1=0, A2, A3, A4, A5, A6, A7, A8,
B1, B2, B3, B4, B5, B6, B7, B8,
C1, C2, C3, C4, C5, C6, C7, C8,
D1, D2, D3, D4, D5, D6, D7, D8,
E1, E2, E3, E4, E5, E6, E7, E8,
F1, F2, F3, F4, F5, F6, F7, F8,
G1, G2, G3, G4, G5, G6, G7, G8,
H1, H2, H3, H4, H5, H6, H7, H8} SquareT;

皆様どうな手法・探索方法でも構いません。
ありとあらゆるやり方でレスポンスの早くて弱いAIからレスポンスが早くて強い
AI。ありとあらゆるやり方でAIの部分だけ考えていきましょう。
とりあえず上のに基礎的な部分をつけるんでそこからは皆さんの力をお借りしながら
地道に強くて早いAIから弱くて遅いAIも作ル予定です。
皆様の案やアルゴリズムの知識をお借りして作り上げていく所存でございます。
では失礼します。
0126124垢版04/09/26 19:13:56ID:uMKqZE6G
対戦きぼんぬ!
0127名前は開発中のものです。垢版04/09/28 21:45:55ID:SANJ/ziE
将棋・オセロ・囲碁・チェス・その他ボードゲームでソースが公開されている
サイトなど知っておられる方おりましたら教えて頂けますか。
よろしくお願いします。
0129124垢版04/10/02 15:29:45ID:vOgyK91B
思考ルーチン作りました。対戦きぼんぬ!
http://www.geocities.jp/team8bit/AIReversi/ai_place.htm
EasyAI

AIリバーシ
リバーシ(オセロ)のフレームワーク。
UI等やルール等のプログラミングを必要なくして、
オセロの人工知能の作成ができます。作成した人工知能で
コンピュータ同士の対戦や人間との対戦ができます。
http://www.geocities.jp/team8bit/
0130124垢版04/10/18 00:05:09ID:6lxdirBj
age
0131名前は開発中のものです。垢版04/10/26 01:24:57ID:NJ6dRo97
>>129
昔作ったオセロを移植中。


評価関数が正しく機能してなくて、
あからさまに変な手を打つ・・・。

勝てるかどうかだけでも確かめたいんだけど、
これってコンピュータ対人間ってできないのかな?
0132sage垢版04/10/30 20:37:51ID:/7gGlUhq
>>>>>>123
なんでチェスなん、しょうぎにしなはれ、てつだうよ
0134124垢版04/11/22 20:25:43ID:0ypaIRpp
>>131
人間用のDLLをロードすればコンピュータ対人間ができるよ。
ダウンロードしたアーカイブに含まれる「man.dll」

>>124
.NET系のみです。
そういわずに.NETで興味持ってください。

EasyAI 対戦希望中!
ttp://www.geocities.jp/team8bit/AIReversi/ai_place.htm#reversi8
0135131垢版04/11/23 18:55:07ID:U7/P+cw3
>>134
お、ありがとん。

バグは直ったけど、勝てないw
Sample2が妙に強いような・・・
0136124垢版04/11/23 19:23:01ID:JiDSQ1Zx
>>131
完成したら対戦みてみたいので公開きぼんぬ。

0138131垢版04/11/23 23:49:20ID:U7/P+cw3
>>136
ttp://up.isp.2ch.net/up/9407e4644e2e.zip

弱いよw

パラメータを適当に調整してたまたま勝つ時も
あったけど、アルゴリズム的には確実に負けてるぽ。
0143131垢版04/11/26 01:36:53ID:CO1qZ58U
>>139
すまーん、昔パスワード設定してたのがそのまま
残ってた。パスワードも忘れちゃった。。。

というわけで、再あっぷ。パスワードはありません。
ttp://up.isp.2ch.net/up/a5e050cbaeeb.zip
0144名前は開発中のものです。垢版04/11/26 19:28:22ID:nwd/oqGi
AIリバーシの開発者です。
いろいろ修正箇所があるみたいなので、
近いうちに修正します。
リーグ戦モードとかもほしいですね。
選択した、複数のdllを対戦させて結果を集計する。
0145124垢版04/12/04 14:49:42ID:gQgEz/b/
保守あげ
0147名前は開発中のものです。垢版04/12/05 01:49:20ID:hcIz+0Iu
>>146
各国(アメリカ,オランダ,ドイツ,イタリア,フランス,イギリス)のオセロサイト@日本オセロ連盟
http://www.othello.gr.jp/link/link.html
ここからリンクされてる解説では左下が黒

Y!USA以外にも左下が白になってるゲームをいくつか見つけたけど
Y!USAですらロゴは左下が黒
ttp://us.i1.yimg.com/us.yimg.com/i/us/ga/sl/rv.gif 

ロジステロ、WZebraなど有名ソフトは左下が黒
(オプションで逆にできるソフトもあった)

などから考えてY!USAがあまり深く考えて無かっただけだと思った
0150名前は開発中のものです。垢版04/12/08 16:54:42ID:Gi0qtPED
>>149
ただの総当りで順位とかは考えてないです。
わかりやすいようにwikiに勝敗数を書き加えておきました。

先手後手を入れ替えて同じ相手と二度戦います。
基本的には一発勝負ですが時間切れなどは再試合となります。

強さの目安とAI作成のやる気に繋がればと思い表を作成しました。
このスレでアップされたAIは全て戦わせていこうと思っています。

>>左下に白or黒?
他のソフトにあわせていただけると対戦させるときに楽ができていいなぁ・・・なんて。
0152124垢版04/12/15 20:48:32ID:JZjqhTry
新しいAI来ないね。

>>150
勝敗数同じ場合は、全対戦で取得した
こまの数の多いほうが勝ちですか?
0153名前は開発中のものです。垢版04/12/18 21:05:52ID:NINQi9jk
漏れもオセロ作り始めました。まだ思考ルーチン書いてない&Javaだけどよろ。
ttp://f57.aaa.livedoor.jp/~javagame/#othello
0155名前は開発中のものです。垢版05/02/20 21:45:02ID:zGNXUfDk
簡単な盤面評価のみでCPUの手を決定するリバーシ作ってみました。

http://www.sm.rim.or.jp/~shishido/rev.html

さすがに「先」のこと何も考えないプログラムだとCPUに負ける方が難しい(^^;。
CPU同士の対戦は爆笑物w
0156名前は開発中のものです。垢版05/02/28 20:23:06ID:IrM267L5
nage
0164名前は開発中のものです。垢版2005/03/27(日) 21:48:57ID:4lT2WEWr
王を取る手の評価を評価できる値の最大値として
王を取られる手の評価を最小値とする。

指すことができる手がどれも最小値なら詰み。
0167名無し名人垢版2005/04/03(日) 02:08:06ID:NgV9szJO
ゲ製技板のみなさん、こんばんわ
現在囲碁将棋板では百人組み手なるイベントを開催してます
開発したアルゴリズムを人間相手に試してみませんか?
興味あるかたは是非遊びにきてください

  ∧_∧ パチ!
  ( ´∀`) < 王手!  2次でもやります
  (_⊃__)__  ∧_∧
  (_|\キキキ(∀`; )   【 百 人 組 み 手 】
   “ヾ | ̄ ̄゛と  __)
     “ ̄ ̄ (__)_)   目指せ全板交流!
プレ開催 2日(土) 3日(日)
本開催  8日(金) 9日(土)


4/2(土)から Yahoo!GAMESにて開催!
囲碁・将棋・チェス・オセロに腕の覚えのある奴、ない奴、
今すぐ http://igoshogi2.hp.infoseek.co.jp/kumite.html に来たれ!!!

詳しい時間、受け手の有無などは当日下記のスレをご覧ください。
第2回2ch人気トーナメント特別対局【百人組み手】
http://game9.2ch.net/test/read.cgi/bgame/1110773385/
0168名前は開発中のものです。垢版2005/06/09(木) 22:13:50ID:ZSMa8wY6
Bonanza?
0170名前は開発中のものです。垢版2005/10/12(水) 15:15:38ID:WI1zqV2M
四通八達図式を自動的に導き出すプログラムをC言語を使って作りたいんです
が、参考になるサイト、または本があったら教えてください。
0171名前は開発中のものです。垢版2005/10/15(土) 22:23:30ID:1G3vaMgQ
ここの「囲碁プログラムの作り方[基本編]〜[上級編]」は参考になるよ
ttp://homepage1.nifty.com/Ike/katsunari/
0173名前は開発中のものです。垢版2005/11/16(水) 09:57:51ID:f06QVQmN
489 :デフォルトの名無しさん [age] :2005/11/16(水) 09:16:51
「コンピュータ囲碁の入門」出た
ttp://www.kyoritsu-pub.co.jp/shinkan/shin0511_02.html
0174名前は開発中のものです。垢版2006/03/16(木) 00:41:18ID:yzRgxseK
0175名前は開発中のものです。垢版2006/03/22(水) 23:42:04ID:vkTXhv7l
六角形オセロ
ttp://www.forest.impress.co.jp/article/2006/03/16/hexalreversi.html

つまらん。('A`)
というか、普通のオセロの方が奥深い気がする…
0176名前は開発中のものです。垢版2006/04/19(水) 23:08:29ID:DffBqyLp
円形オセロ
0177名前は開発中のものです。垢版2006/05/17(水) 16:17:21ID:zNRWs9Vk
誰か囲連星の強いプログラムを作ってくれ。
http://irensei.com/
0178名前は開発中のものです。垢版2006/05/24(水) 02:42:18ID:uUkE2Sm7
>>177
たしかに弱い
0180名前は開発中のものです。垢版2006/09/11(月) 07:47:50ID:53++tl6w
オセロの簡単な裏返し判定の仕方がわからん!
思いつくのはめんどくさいものばかり・・・。
5行ぐらいで書けんものかね
0182名前は開発中のものです。垢版2006/09/11(月) 17:01:08ID:53++tl6w
それをぜひ教えてもらいたい
0183垢版2006/10/03(火) 19:48:14ID:ssSQFQDH
皆さん:
私はc言語を勉強し始めたばかりなので、何方が教えて欲しいんですが、”typedef”って何ですか。分かっている方に説明して頂く、もしくは適当なホームページを教えてください。
メールアドレス:ou-gain@hotmail.co.jp
0185名前は開発中のものです。垢版2006/10/06(金) 15:20:30ID:BZAZHA4r
構造体をつくるのに typedef struct 型名{〜} って書く以外に使った事がないな。
他に使い方あるの?
0187名前は開発中のものです。垢版2006/10/19(木) 22:25:50ID:JdYr9qe3
ボイーンた
0190名前は開発中のものです。垢版2007/08/15(水) 14:23:59ID:eTu4t7jm
最近囲碁にハマってるからなんか作ってよ
0191名前は開発中のものです。垢版2007/10/11(木) 18:25:21ID:WcPq61Rp
盲人がキーボードだけで出来る将棋ソフトなんてないでしょうか
http://siva.cc.hirosaki-u.ac.jp/usr/koyama/syogi/
今これを使ってみているんだけど、不具合が多くてなかなか進まない
0194名前は開発中のものです。垢版2008/02/16(土) 09:58:58ID:KtZWjP5k
CUDAなどを使ってGPUで計算させると面白そうだ。
0195名前は開発中のものです。垢版2008/04/30(水) 15:20:28ID:4Fbo/hMM
コンピューターの読みを出力させるにはどうすればいいの?
0196名前は開発中のものです。垢版2008/05/10(土) 23:17:40ID:UE0xWEqz
実際の音声で単語を録音して、組み合わせるしかない
0197名前は開発中のものです。垢版2008/05/12(月) 14:49:54ID:mBwB2m7O
やはり女性の声がいいですよね、探してみます
0198名前は開発中のものです。垢版2008/05/25(日) 12:52:24ID:v7y4T+jh
>>180

オープンソースでいくらでもあるからわからないってことはないだろ

おれが難しく感じるのは評価関数のほう、膨大な棋譜から学習しないと
パターンの重み付けができない・・・
0199名前は開発中のものです。垢版2008/06/03(火) 17:09:36ID:bT9imSji
オセロはとりあえず、全検索で獲得枚数で重み付け出来れば形にはなる。
環境によって5〜6手読めればそこそこ強いんじゃないか?オレはその時点で勝てない。
定跡は難しいね。そもそも定跡あるかも知らん
0200名前は開発中のものです。垢版2008/06/04(水) 14:37:57ID:FeKBeHI/
200
0201名前は開発中のものです。垢版2008/06/04(水) 14:45:10ID:FeKBeHI/
201
0204名前は開発中のものです。垢版2008/08/11(月) 16:47:59ID:LInsAIev
室内ゲームのオリンピックとかあったら面白そうだよね(´・ω・`)下は主な種目
バックギャモン等の勝敗が運という不確定要素で変わるものは除外

囲碁
将棋
麻雀
チェス
チェッカー
ダイヤモンドゲーム
オセロ
0206名前は開発中のものです。垢版2008/08/12(火) 00:01:54ID:SwJzMxYu
>>204
バックギャモンより麻雀のほうが運の要素が高い気がする
0208206垢版2008/08/14(木) 04:14:09ID:pnoBoDTH
確かに不確定要素除外なら
二人零和有限確定完全情報ゲーム限定になってしまうね。

バックギャモンは上手い人には勝てないし
覚えたての人には絶対負けなさそうだけど

麻雀は半荘だとルールを知っただけのその日に
トップを取れることもあるから

麻雀のほうが運の要素が高いと考えてるんだけど。

確かに麻雀は研究が進んでないから
勝負になるのかもしれないけどね。
0210名前は開発中のものです。垢版2008/08/14(木) 09:45:11ID:3T//7uKC
配牌要素のある麻雀がありなら、UNOもありになるな。
不確定要素もありにして、数回勝負にするほうがよくね?

あと、個人的にはジェンガなんかの手先系も欲しい。
0214名前は開発中のものです。垢版2008/09/18(木) 02:41:51ID:WM6ksVHC
今将棋ソフトをC#で作ってます

ベースの将棋プログラムがあって
AI部分はそれぞれのプログラマがdllで書いて、みんなでdllファイルをうpし合って対戦
みたいなのがあればなと思っています

.
0219名前は開発中のものです。垢版2008/10/02(木) 14:32:26ID:BqcJEAH9
思考エンジンを>>218がうpしてくれるのwktkしてまってる
0220名前は開発中のものです。垢版2008/10/03(金) 00:40:55ID:1JgFthiv
まず将棋の駒なんだがダサい。
もっとチェスみたいにセンス良いのに変えて。

それと動かし方も特殊なの作って。
0223名前は開発中のものです。垢版2008/10/04(土) 13:01:40ID:VpyxnnCf
古いチェスソフトだがBattleChess
コマが甲冑着た兵士で、動かすとそのマスまで歩いていって敵のコマを斬りつけて倒すのが衝撃的だった
0224218垢版2008/10/06(月) 03:50:43ID:1QX8X5Nt
>>219
ありがとう
ようやく合法手が打てるようになって、
駒はまだランダムに動いているだけ
完成まで何年かかるのかしらw
0225名前は開発中のものです。垢版2008/10/06(月) 16:53:13ID:swcT6QuF
>>223

衝撃的でもなんでもない。
元が兵士だの王様だのの戦いだろが。
そういうのをゲームにしたのがチェスだろ。
0227名前は開発中のものです。垢版2008/10/07(火) 22:15:10ID:myhHSj3x
衝撃的でもなんでもない。
元が兵士だの王様だのの戦いだろが。
そういうのをゲームにしたのがチェスだろ。
0229名前は開発中のものです。垢版2008/10/14(火) 15:31:10ID:Av4ni/WQ
将棋もチェスも元が兵士だの王様だのの戦いなのは今さら口に出して言うことが恥ずかしいほどの常識
明言してないからと言ってそれを汲み取れない>>223が馬鹿
0231名前は開発中のものです。垢版2008/10/15(水) 22:56:17ID:GHJkid7K
ん、斬新な解釈じゃなくて、アニメーション効果に衝撃を受けたんじゃないのかと思ったんだが、
なんで古代の戦争を模したという常識を知らないという前提で叩いてるの?
0234名前は開発中のものです。垢版2009/06/13(土) 07:41:09ID:2+1LYKG9
あげ
0235名前は開発中のものです。垢版2009/06/16(火) 02:11:21ID:1CAlzcIC
習作のため、一番簡単なゲームってなんだろ?
0236名前は開発中のものです。垢版2009/06/16(火) 10:40:56ID:f0RK5lBp
┌─┬─┬─┐
│  │  │  │
├─┼─┼─┤
│  │○│  │
├─┼─┼─┤
│  │  │×│
└─┴─┴─┘
0238名前は開発中のものです。垢版2009/06/25(木) 22:18:37ID:5GUe6Bd4
オセロ完全解析してゲ製作板大勝利しようぜ
0240名前は開発中のものです。垢版2009/08/03(月) 22:14:14ID:f4vLj/hM
例えばポーカーなんかで、
1枚ドローするところを、内部的に2枚引いておいて強い方を採用する…
っていうのは、プレイヤーにバレちゃうものだろうか。
0241名前は開発中のものです。垢版2009/08/03(月) 23:35:10ID:2X7HBGWU
採用しなかったほうを引く山に戻すならばれにくい。
捨て札にしたら、最後に山の数が合わなくなってばれる。
0242名前は開発中のものです。垢版2009/08/07(金) 18:27:28ID:R45zmvwz
山札に戻すのは、当然として。
戻すときに一番上/下に戻すのと、ランダムな位置に戻すのとでは、また変わってきそうね。

対戦相手となるキャラ(コンピュータ)ごとに特殊能力が設定してあって、
ドロー運がとんでもなく高いキャラとかなら、十分に使える方法かなとは思ってるけれど。
0243242垢版2009/08/07(金) 18:30:04ID:R45zmvwz
失礼。
>242の1段落目は>241へのレス、2段落目は2枚ドローの話題全体へのレス。


んー、確率計算をちゃんとするプレイヤーには評判悪そうだなあ。
0246名前は開発中のものです。垢版2011/11/01(火) 08:52:13.81ID:GguZlPOT
将棋モドキなら昔から誰もがいくつも考えて出してる。
そのどれもが将棋を超えられなかった。
なぜなら新しくルールを覚えるのが面倒だから。

なので将棋型対戦ゲームは、面白くてプレイ人口が多いものに収束していってしまう。
新作側がそれを乗り越えるには、作り手がよほど苦労して広めるしかない。

ドラクエは実は構想時にはすでにドラクエ3の要素まで考えられていた。
ただ、いきなり3を出してしまうとプレイヤーがルールについていけない。
なので、ポートピア殺人事件というコマンド選択型ゲームをまず出し
次にドラクエ1でRPGの基本的要素を広め
続いて2で仲間を一人づつ増やしてパーティープレイ型を定着させ
それが出来てからやっとドラクエ3を出した。

どんなに面白いものでも、段階的に簡単なものから広めないとうまくいかない。
斬新ルールだが基本的な要素のみに特化した簡易バージョンが必要だ。
0247名前は開発中のものです。垢版2011/11/02(水) 12:02:01.50ID:w8/vJaN3
>>246
駒二種類減らした4面体(占領、武士、巫女、怨霊)ではどうです?
実際に作ったら、とても手が出せない見積もりを頂きましたので、
没にして6面体に戻しましたけど。
パソコン上で動かすだけなら、負担は減るはずです。

あと駒数を減らすのはOKです。
2個づつから試して慣れるごとに駒数を増やしていってください。
盤面を「5×5」にして試してもいいと思います。

あと「段階的に簡単なもの」があれば、お願いします。
ただ、以上のことを段階的に教えるのはともかく、
各段階のをつくれとかいわれるのは無意味だし経費的にも無理ですね。
0248名前は開発中のものです。垢版2011/11/04(金) 11:16:01.70ID:2Ept5nIz
そういう問題じゃねぇって。遊ぶ側に苦労を押しつけんなって言ってんの。

テキストでルールとだいたいの遊び方が説明してあるだけの
面白さがわからないゲームで、しかも二人必要だから相手にもルールを覚えさせて
なおかつコマやらボードやらも用意しないといけない、なんて今じゃ誰も手を出さない。

面白さの中心部のみを抽出してすぐに覚えられるゲームにして
フラッシュですぐに遊べるようにして、しかもそこそこ強いCPUが相手してくれる
ぐらいじゃないと、今は客が寄り付かないの。

本気で遊んで欲しいなら、あちこちコピペ貼り付ける苦労をするんじゃなくて
プログラム覚えて自分で完成させるぐらいの苦労をしろ。
俺は自分が遊びたいゲームを作るためにプログラムを覚えた。
0249名前は開発中のものです。垢版2011/11/05(土) 10:41:52.88ID:cjBsr1SG
>>248
そうですね。
例えは悪いけど勇者の手を引いて代わりにモンスター倒して
魔王のところにつれてってて言うくらいの親切さがないと
ダメかもしれませんね。
でもそれで面白いのって感じはしますが。
0250名前は開発中のものです。垢版2011/11/07(月) 19:51:57.88ID:zjfEWUd+
だからそういう問題じゃねぇって。

>面白さの中心部のみを抽出してすぐに覚えられるゲームにして
>フラッシュですぐに遊べるようにして、しかもそこそこ強いCPUが相手してくれる

のは、やってるゲームはあるけど

>例えは悪いけど勇者の手を引いて代わりにモンスター倒して
>魔王のところにつれてってて言うくらいの親切さがないと

なんてゲームはないだろうが。例えが悪すぎる。
0251名前は開発中のものです。垢版2011/11/07(月) 19:59:20.54ID:zjfEWUd+
ゲーム中の楽しい苦労と、ゲーム始めるまでの煩わしい準備の苦労を
同一視するから変な例えになるんだよ。

例えるならハイキングのちょっとした山登りだ。
山のふもとに行くまでに普通の市街地や住宅地を何十キロも歩くのは苦痛。
だから山のふもとまで行くバスが必要だ。ってのが俺の言いたいこと。

お前はそれを「だったら頂上までバスで行けないとダメかもしれませんね」
って言うから話がおかしくなる。
山登りの途中は景色楽しみながらの苦労だからいいんだよ。
0253名前は開発中のものです。垢版2011/11/10(木) 22:08:34.35ID:lXNjDaXU
>>248
ご指摘ありがとう。

俺はおもちゃ屋で将棋やオセロの隣に並べるのが目標だったから、
プログラム組むとかそういうのは考えてなかった。
ていうか、そんな技術持ってないし。
でも、おっしゃることはごもっともです。
どこかプログラムを替わりにつくってくれるところを検索して探してみます。
0254名前は開発中のものです。垢版2011/11/14(月) 19:50:52.02ID:SMI23/ZQ
ああ、そっちの方で目指してるのか。なるほど。
でも、それもかなりの茨の道だぞ。

おもちゃ屋で定番になって対戦思考ボードゲームなんて
ホントその将棋やオセロか囲碁ぐらいしかないし。
その他のゲームは出ては消えていくだけの存在だ。

目指すとしたら、ドイツボードゲームの系統かな。
基本的にはサイコロやシャッフルカードを使うものだけど
まれに運要素無しのガチ思考ゲーもあったりするし。
でもその場合、最初に覚える要素が凄く単純なものしか残れないし、ウケない。
0255名前は開発中のものです。垢版2011/11/14(月) 20:00:08.65ID:SMI23/ZQ
あと、プログラムを替わりにってのは、金出さないとまず無理だと思う。
ゲームを本気で広めたいなら、プログラムしてでも自分で作るべき。
それが出来ないなら、その程度の本気度でその程度のゲームだったって事だ。
0258通りすがりの妖術僧垢版2012/07/27(金) 16:18:03.62ID:GFEdOn68

以下のような本もあるしサイトも結構ありますね。

アマゾンで取扱い
「コンピュータ将棋のアルゴリズム―最強アルゴリズムの探求とプログラミング-I・O-BOOKS-池-泰弘」
0259名前は開発中のものです。垢版2012/10/17(水) 06:16:37.40ID:uzozAJ35
将棋
0260名前は開発中のものです。垢版2012/10/17(水) 07:42:20.83ID:9gtPUv5X
>>258
かなり古いが森田和郎が書いたコンピュータ将棋の本もあるな
「もしかしたら世界初のコンピュータ将棋の本」らしいから、今からしたらかなり初歩的なことしか書かれてないが
0261難しいね垢版2013/01/24(木) 19:30:18.98ID:Kycj3XA0
最近覚えたけど、ぜんぜん勝てない
0264名前は開発中のものです。垢版2013/04/23(火) 07:05:31.51ID:6N0ZI5Zs
>>255
>あと、プログラムを替わりにってのは、金出さないとまず無理だと思う。

金を出さないなら、企画ごとプログラム担当に乗っ取られても文句言えないよな
0265 ◆taka1B7CEQ 垢版2013/04/26(金) 18:31:25.31ID:CXgUOPi8
▽持ち駒:
┌──┐
│▽王│一 最終手
├──┤   には
│▽歩│二 ★☆を
├──┤   付けて
│▲歩│三 下さい
├──┤
│▲王│四
└──┘
▲持ち駒:
0266名前は開発中のものです。垢版2013/05/11(土) 22:28:05.03ID:5yfnRn37
友達と将棋盤に、自分は将棋、相手はチェスを並べて戦っている
(チェスは1列足りないので、キングを中央にくるように、端列は開ける)

取った駒は再利用不可で、昇格は昇格する駒に応じて、チェスは相手の最前線、将棋は相手の3段目で昇格

チェス側が強くて勝てないよ・・・
0267名前は開発中のものです。垢版2013/05/12(日) 13:24:34.46ID:9mOVMO8z
将棋側は、あまり動かずに、金・銀を密に連携させて防御陣形をとるべし

チェス側は、ポーン以外はすべて大駒だから、機動力が大きいが、多方向に利くのはクイーンとキングのみだから、そこを狙うべし
クイーンもキングも取られるわけにはいかないから、玉と金2枚で支援して銀2枚を捨てられる将棋側は有利

チェス側はポーンで斜めスクラムを組んで防御前線を張れるが、正面の駒を取れないのが痛い
0268名前は開発中のものです。垢版2013/05/13(月) 17:58:19.66ID:be264q5E
Zillions of Gamesをインストールすれば、自作ゲームがすぐに作れるよ
http://www.zillions-of-games.com/

Zillions Rules File (ZRF)というルールファイルを、テキストエディタで構文に従って書き換えるだけ
http://www.nakajim.net/index.php?%E3%82%A2%E3%83%96%E3%82%B9%E3%83%88%E3%83%A9%E3%82%AF%E3%83%88%E3%82%B2%E3%83%BC%E3%83%A0%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%83%BC

もとのゲームファイルの修正で済むようなもの(駒数変更,駒の移動範囲の変更,盤の升目数の変更など)はとても簡単
他の人がアレンジしたボードゲームのZRFも、ダウンロードして参照すると使用可能
http://www.zillions-of-games.com/games/index.html
0271名前は開発中のものです。垢版2013/05/20(月) 20:20:47.74ID:Jmw0rbja
ZoGの中将棋AIは最強らしいから、やってみたいな
有料だから残念か

将棋対チェスは、ggると調整されたルールが出てくる
0272名前は開発中のものです。垢版2013/05/24(金) 18:09:30.06ID:35JPsAxI
>>271
調整ルールの詳細希望!
0273 ◆SHOGI//OTA 垢版2013/05/24(金) 18:48:56.85ID:o/L4nan1
チェス側も6枚以上になると駒打てるってルールだったかな
将棋が日本、チェスがアメリカか
0276名前は開発中のものです。垢版2013/05/26(日) 02:43:56.90ID:Px4RuB9Z
>>273
サンクスです

確かに大駒中心のチェス側は、高い機動力を生かして序盤は優勢だけど、
終盤は取り合いになると、守備範囲が狭いチェス側は守りきれなくて死ぬ

ある程度、駒をとってから打てるようになるわけね・・・
将棋側はチェス駒を打つわけだけど、チェス駒はナイト以外は向きが分かりにくいから、相手に使用されると嫌だな
0277 ◆SHOGI//OTA 垢版2013/05/26(日) 07:32:03.70ID:eRYu9esk
リアでやる時は色反転させるからおk
これでもチェス側が勝つとなれば、一気に決める必要があったりして。(w
将棋が金銀で固めてしまうと手がでないヨ。。。

将棋対シャンチーもあるかな
0281名前は開発中のものです。垢版2013/05/27(月) 19:39:26.72ID:9pbfjPhK
まずはHPでソフト(体験版:無料)をダウンロード
これで、デフォルトの48種類のゲームが可能(将棋,チェス,チャンギ,シャンチー,マックルックなど)
使用期限はないけど、機能制限(自作ルールが使用不能)あり

次に、Help>Unlock Full Versionを開いて、NameとCodeに数字を入力すると、機能制限が解除されるよ
これで、OpenRuleGamesから参照することで、ダウンロードサイトの亜種ゲームや変則ゲームも使用可能になる

間違っても、「Zillions of Games」,「keycode」,「serial number」,「passward」などでググってはいかん!
(倫理的にね・・・)
0282名前は開発中のものです。垢版2013/05/27(月) 19:44:10.89ID:9pbfjPhK
>277
そうか、将棋側は、使っていない相手(チェス側と逆の色)のチェス駒を使えば良いのか・・・

チェスの駒は、打ち詰めたり、合い駒を打ったりするのに向いていない・・・
でも、チェス側が手に入れるのは将棋側の駒だから良いのか

相手に取られたチェス駒を、さらに取り返して打てるとなると、チェス側はチェス駒を打てるわけで、新感覚だな
0283名前は開発中のものです。垢版2013/05/28(火) 18:33:34.08ID:E62L+nG5
>>278
チェス側はナイトが1個足りなくないかい?
ナイトとルークの位置が逆なのも意味があるのかな

チャンギとシャンチーは似てるから、シャンチー VS チェスなら、すぐにできそう
0286名前は開発中のものです。垢版2013/06/08(土) 19:23:27.40ID:NBTDQ+RS
立体チェスとか、円形チェスとか、六角形チェスとか、チェス系はバリエーションがスゴイ!
0287 ◆ZSCoFl63NY 垢版2013/06/09(日) 17:15:43.33ID:R+TCfNWQ
他スレでなかなかレスがつかずにこちらにカキコしました。

ループオセロを作りました。exeファイルなどはトラブル防止のため、あえて添付していません。
動作環境はWindowsです。Cコンパイラがない方は、同梱のreadme.txtを参照してください。
コンパイル方法はreadme.txtに全て記述してあります。
↓にうpしてあります。
http://soft186.e-whs.jp/cgi-bin/up2/img/55.zip

少々強引なコーディングですが、何とか形になりました。
率直な感想を聞きたいので、どうかダウンロード&コンパイル&プレイしてやって下さい。

私のスペックですが、C/C++がそこそこ使えて、フリーソフトを公開した実績がありますが
プログラマとしての実務経験はほぼゼロです。
0288名前は開発中のものです。垢版2013/06/13(木) 18:55:25.55ID:8V7u006/
なんかドラクエの世界地図みたいですね
東西ループ+南北ループ
もはや角や端は意味を持たない
最後までどんでん返しがあり得るが、盤のマスは有限と
なかなか面白いのでは?
メール希望者には、exeで送っても良いのでは?

できれば、その技術で、「チェスVS将棋」のインターフェイスを作って欲しい
AIなしの対人対戦専用ソフトで
0291名前は開発中のものです。垢版2013/06/15(土) 21:26:29.87ID:Yvu65IEz
>>287
がんばれ!!
0292名前は開発中のものです。垢版2013/06/16(日) 12:19:37.51ID:THgmSpSn
縦列が一周ごとに下にずれたり
横列が一周ごとに右にずれたりすると
更にややこしくなる。

ていうか残り1枚から大逆転が可能になる
0296名前は開発中のものです。垢版2013/06/25(火) 20:10:45.63ID:8VH9PpPP
0297名前は開発中のものです。垢版2013/06/30(日) 12:35:57.68ID:epiVBrxw
リアルタイムストラテジー型のチェスとか、HP制の将棋とか、おもしろいかも?
0298名前は開発中のものです。垢版2013/06/30(日) 20:09:35.38ID:CusNUCHO
その昔、バトルチェスってのがあってな・・・
0300名前は開発中のものです。垢版2013/07/02(火) NY:AN:NY.ANID:bfbryvu1
FFみたいなアクティブタイムバトル(ATB)制とか、
タクティクス・オウガみたいなウエイトターン(WT)制は?
0301名前は開発中のものです。垢版2013/07/03(水) NY:AN:NY.ANID:wkoZZDOw
ハンターハンターの軍棋をゲーム化するとかね。
つうか軍棋って同じ名前で実在するんだな。日本にも軍人将棋ってのがあるが。
ここで色々案も挙がってるが、すでにPCもない時代からこういう考えはあったわけだ。
0302名前は開発中のものです。垢版2013/07/07(日) NY:AN:NY.ANID:1jzG+TM2
軍蟻は良いかも!
著作権が難しいが・・・

軍人将棋はバリエーションとローカルルールがありすぎて対応が大変
ZoGにも欲しいな
西洋軍人将棋(ストラテゴ)は、PCでも割と見かけるが
0303名前は開発中のものです。垢版2013/07/07(日) NY:AN:NY.ANID:0lzHS3C/
ハンターのあれってちゃっとルール公開されてたの?
コマが3つまで重ねられるって事しか解んないわw
0304名前は開発中のものです。垢版2013/07/07(日) NY:AN:NY.ANID:lXyODQZR
ルールなんて自分でこさえちゃえばいいよ。
コマを重ねるってのは、要するに馬にのせたり方天画戟といった装備だったり
名声や決意・覚悟といった精神的なものの加点要素なんじゃないのか?
あるいは倒れた仲間を回収して回復ポイントまで運べるとか。逆に補給物資を運んでいるか。

将棋やチェスなら、味方のコマと重なると2倍の能力になり、一回とられても相打ちで敵も倒せて、自分はそこに残れる、的なシステム。
0306名前は開発中のものです。垢版2013/07/08(月) NY:AN:NY.ANID:VxgBNd3t
なるほど、高さ=三次元的なゲームだったのか。
二段や三段のコマは一段のコマには抜けれず壁の役割になれる。
壁構築で地形みたいな要素にもなる感じかな?
0308名前は開発中のものです。垢版2013/08/03(土) NY:AN:NY.ANID:gVJOFEFN
age
0309名前は開発中のものです。垢版2014/09/08(月) 16:59:53.68ID:67y2qr+m
教京サーバアビエ無戸籍交際薬剤消毒介護職利権ローション羽田帝国上層部24時間パトロール義務上野飲み会マックさむらいニューヨーク森林火災チェック問題ヤーフォー確定申告不足ラーメンスーパーポイントdビデオデッキ破壊タイピングGTX860MIGOZ

教京サーバアビエ無戸籍交際薬剤消毒介護職利権ローション羽田帝国上層部24時間パトロール義務上野飲み会マックさむらいニューヨーク森林火災グリーにんにく牡丹黒家宝ラーメン

教京サーバアビエ無戸籍交際薬剤消毒介護職利権ローション羽田帝国上昇部24時間パトロール義務セコム強盗マックさむらいニューヨーク森林火災グリーにんにく牡丹黒家宝ラーメン
築地TPP偏食中国人勧誘マナー憤怒北京オリンピックパブ立橋フロアWHO経済制裁代協議会飲み食い代官僚日テレ漏洩ボーリングITC問題調査福岡駐車近代道廃人画税幕張銀行ググール無断決裁広告料寒孫ゼリー失調栄養士指的フィルム不毛ハンバーグースラーメン

糞箱弐個弐個沖縄ランド近年ペット原発難民船頭100万円コミックコラムシフト廃品鉄工業プラチナ小スモ再販問題WHO光金アナ雪エネルギーソーシャル決裁ニッカン奮闘鬼記者サービスカ米ラマン露店捜査キセルストアアイダホ会長農家不動産工場感激息子
0310名前は開発中のものです。垢版2015/08/18(火) 16:59:55.72ID:QcCJSSMl
どなたか教えていただけますか?

最近、オセロAIのプログラミングをCで行っています。
今は、探索ロジックの勉強のため、終盤の完全読みを作っています。
置換表付negaMax、置換表付PVSは通常の探索ではきちんと動作しています。

現在MTD(f)にとりかかりました。MTD(f)では、ドライバは擬似コードそのまま。
テスト関数は置換表付negaMaxを流用していますが、そのままだとFail-LowとminMax値
の区別がつかずに、Fail-Lowの指し手を返してしまうので、初段のみαを-1する事で、
内部的に区別できるようにしています。

動作確認にいくつかテストケースでテストしましたが、FFO#40の時におかしな事がおきます。
(FFO:http://www.radagast.se/othello/ffotest.html

問題)本来の評価値は+38(A2B1C1…)なのに、+30が返る。

以下、判明している状況です。
1)置換表を使用せずにMTD(f)を動作させる。 −>正解
2)単体でNull Window Searchを行う。      −>正解
3)置換表を使用してMTD(f)を動作させる。   −>少なくともFFO#40では誤答する
4)FFO#40で失敗する条件は、fにminMAX値より幾分小さい値(黒+30未満)を設定したとき。
5)negaMax初段でαを-1するロジックを入れなくても、同じ事になります。

デバッグで確認したところ、Fail-Highになるべき条件(黒+30や黒+36の時)で、下限値を
返しています。同一条件で、下限をさらに-1してテストしたところ、α<g<βである事が確認
できましたので、minMax値として間違った値が返っていることになります。

どうも原因は置換表にあり、Null Window Searchの中で、何回も再利用していることに
あるように思います。とはいえ、MTD(f)といえば置換法を再利用する事が前提です。
どこかに誤りがあるのではないかと思います。

同じような問題に遭遇した人はいますか?
0311310垢版2015/08/18(火) 17:06:51.32ID:QcCJSSMl
ちなみに、置換表のキーは、盤面と手番です。

ハッシュ値を使用し、衝突した場合は、チェーンで下につなげています。
今のところ、メモリーの上限等は設定しておらず、領域も足りています。
0313310垢版2015/08/18(火) 23:21:46.36ID:5wjtKO2B
何がですか?
0315310垢版2015/08/19(水) 09:33:45.34ID:DdofkXsp
いなければ仕方ないですね。

テスト関数を置換表付negascoutにしたら、ちゃんと答えが返ってくるようになりました。
けど、なんか気持ち悪い。置換表の扱い方は一緒なので、たまたま上手く行ってるだけ
ではないかと思います。むむむ。

MTD(f)にこだわり続けてもあんまり意味が無いので、評価関数づくりに入ります。

3層パーセプトロン型にするか、普通の線形回帰にするか。
パーセプトロンタイプは、パターン学習のタイプを作ってみましたが、学習データ340万
棋譜に対して、1回回すのに3日がかりという状態で、検証サイクルが回しづらい状況な
ので、簡略化をするか、線形回帰を試すか思案中です。最終的には、両方作って対戦
させてみるかと思っています。いつになる事やら。
0316310垢版2015/08/24(月) 09:51:00.08ID:Y8Lk5h3w
BITBOARDで確定石をそこそこ正確に求める方法を考えました。
思いっきり脱線中w

ただ、斜め方向に「列すべてに石が置かれている」状態を検出する方法と、
その時に、斜め方向の列すべてに確定ビット(仮)を建てる良い方法が見つ
からずに、斜め方向のAND用の定数配列を用意してループを15回回してる。

縦横は、分割統治でそこそこなロジックになったんだけど。

45度回転を使っても、そんなに高速化できそうにないなぁ。

もちろん、完璧な確定石ではありません。
拾った石は確実に確定石ですが、確定石なのに拾えない石が若干あります。
0317310垢版2015/09/02(水) 11:43:34.50ID:s0BtWfox
ぬぬぬ。パターンによる線形回帰の石差予想。
最急降下法は収束してるんだけど平均2乗誤差が480とかになる。
1σでいうと1局面あたり22石(黒石の数では11石)もの誤差。
これでは使い物にならない。

ステージ分割しているんだけど、ステージが進んでも誤差はほぼ一緒。
ウェイトがオールゼロでも似たような数字になるレベル。
テストデータで局面評価させると、それなりに石差は計算しているっぽいが、
最善手で終局まで打ったデータ入れるとステージによって評価値が全く違う。

初期値をゼロからスタートすると、この辺なんだけど、1とかからスタートすると
もっと誤差が大きいところで収束してしまう。初期値を乱数にしたら、更に大きな
誤差で収束してしまう。

ローカルミニマムに捕まってるのかなぁ。

いくつかミスは見つけたけど、本質的な場所じゃないので、結果も変わらず。
むむむむ。
0319310垢版2015/09/02(水) 21:57:59.44ID:5gNGVEfH
正規化というと、thellさんのlearning.pdfで言うところの、αの設定ですか?

当初はmin(β/100,β/Nj)の正規化型で作ってましたが、上手くいかないので
収束を早めるのは後回にして、今は単純にステージ毎の局面データ件数α=β/Nの
形にしてます。

が、発散を避けようとすると、βをあまりに小さくしなければならないのが、なんか変な
気がしています。今は10の-7〜-8乗くらいの値です。やっぱり変ですよね。

最急降下法のコードどこか間違えてるんだろうなぁ。
0321名前は開発中のものです。垢版2015/09/03(木) 04:36:35.33ID:CNXgxM7O
あ、オセロのAIにはぜんぜん詳しくないんだけど
対局を見てたらクルクル石差が入れ替わるので
読み切らずに局面から石差を判断すると
どうなるんかなと思って
0322310垢版2015/09/03(木) 10:19:29.05ID:Fd8XT4rV
色々と失礼しました。

もう一度、よーく上記pdfを読み返していたところ、原因らしきものが見つかりました。
記載にあいまいというか、ちょっとおかしいところがあって、式の変形をしっかり追って
確認すれば良かったのですが、思い込みで解釈をして変な計算をしていました。

そこをとりあえずざっと修正したところ、遅々としつつも収束に向かっている模様ですが、
まだまだ完全ではないようです。ある程度二乗誤差が減ったところで、また増え始めたり
しています。正規化も試したけど、やはり同じ。

もう少し、検討してみます。
0323310垢版2015/09/03(木) 10:38:17.33ID:Fd8XT4rV
>>320
もともとひっくり返しあった後の終局を予測するのが目的なので、教師データは最終局面
の石差です。盤面の特徴(パターン)から、最終石差を予想するための重回帰計算なので、
その時点の石数は、説明変数に入れてません。なので、パターンの選択が適切なら、
最善手の応酬において1手毎にどれだけ石数が入れ替わろうと、影響を受けずに、
二乗誤差が終局に近づくほど減っていくと予想されます。
というか、そうなるように説明変数であるところのパターンを模索していくと理解しています。

手元にあるwzebraなんかは、評価値と称して最終石差予想が表示されているのですが、
やはり、ある程度の誤差を含みつつも、大きくぶれているようには見えません。


評価関数の使い道を考えると、実は絶対値はそれほど重要ではありません。
中盤探索のn手読みの時の盤面評価と、ムーブオーダリングに使うので、ある局面から
派生したn手先の局面における相対的な関係が保たれていればOKです。
また、MTD(f)法などを使う時の、fの初期値設定にも使います。この時は絶対値で正確な
方が良いはずですが、外れはすぐにカットされて次に行くので、トータルの時間に対する
影響は小さいように感じます。

とはいえ、相対的な関係が保たれているのかをチェックするのは難しいですから、
結局のところ出来上がった評価関数の評価は、教師データとの二乗誤差の小ささに
するしかないかなと。
0324310垢版2015/09/07(月) 01:11:39.28ID:OHPpdG+6
収束しかかった二乗誤差がまた増え始める原因はまだわかりません。
増え始めるまでは収束方向には向かっているのは確かなのでβの初期設定を
いって誤魔化す方向で。最急降下法ってこんなものなのかなぁ。

一通り納得したので、パターンをLogistelloと同一のものにまで拡充してスムージングも
入れてみましたが、新たなバグを仕込んでしまった模様で、一部計算がぐちゃぐちゃorz
バグ探しの旅に出ます。

裏で、Solverの速度アップを検討。
CountBitとPOPCountを組み込み関数にしてみました。FFO#40で30%ほど改善。
続いてFlip関数を64個のポインタ関数にしてみましたが、時間はほぼ変わらず。
ポインタ関数内の処理が非効率なのか。

Flipのデバッグ中に確定石計算でバグっぽいものを見つけましたが、回帰が落ち着く
まで見なかった事にします。
0325名前は開発中のものです。垢版2015/09/10(木) 17:45:51.81ID:R9JX9LJx
将棋の全駒にユニークなIDを振り、局面を将棋盤に見立てたkoma[9,9]にIDを入れることで表現しようと思っています
その場合、駒のIDから座標を取得するいい方法ってないんでしょうか?
IF文、Case文のオンパレードになってしまうのは仕方ないのでしょうか・・・・

言語C#
0327310垢版2015/09/14(月) 09:33:29.38ID:Rx5y2/Cc
線形回帰で相変わらず時間食ってます。
一応、バグらしきものはそれなりに解消されましたが、やはりいかんせん収束が遅い。
一晩かけて50〜100試行して、途中で止めてやり直しなんてのやってる間に1週間は
あっという間に経ってしまうものです。まだ誤差が大きい。1000回程度回して、どこまで
収束するか見てみようかなと。またぞろ3層パーセプトロンが気になる今日この頃。

確定石計算もバグ取りはできたと思いますが、その分計算が1.5倍ほどに膨れてしまい
ました。しばらく思考実験していたら、確定石なのに確定していると評価できない確実な
パターンも思いついてしまって、どうせその程度のものなら重い確定石計算しないで普通
に準確定石程度にしとくのが良いかと悩み中。

Solverの速度アップですが、前からやろうと思っていた事を少しづつやっていますが、
統計とってきちんとやっていないので10%くらいの差だと良くわからない状況です。
コードのメンテナンス性が下がるのがネック。negaMAXが思いの他高速化してしまい
ましたが、MTD(f)が低速化しているかも(謎)。

それなりに評価関数が動きだしたので、置換表2枚にして反復深化も試してますが、
信じられないくらい劇遅状態です。これ本当にコストに見合うのかなぁ。評価関数の
計算が、というか、その中の確定石計算が重いんだと思うけど・・・。
0328310垢版2015/09/14(月) 17:35:45.53ID:Rx5y2/Cc
反復深化が劇遅なのは、使い方を誤っていました。
リーフのところまで使うとコストアップなのは考えれば当然でした。
まあ、おバカなバグもありましたが。

negaMaxに対して反復深化を試すと、1割程度の高速化となりましたが、
negaScoutに対してやると多少低速化して、negaMaxの反復深化と変わらない速度に。
scout missが3倍近く増えているので、評価関数の精度があまり良くないためかなと。
move orderには、通常はmobilityとコーナー着手を使用しているのですが、これ、
何故か(少なくともFFO#40に対しては)scout missが恐ろしく少ないのです・・・。

MTD(f)が遅いのも、最初に設定するfを評価関数の値にして、それが結構外れで、
探索範囲が広がったのが原因です。scout missと同様に、結局のところ、途中で評価関数
を求めるタイプの高速化は、評価関数の精度次第という当たり前の結果に。

評価関数入れるとノード探索時間が1/10になるので、やはり評価関数用の確定石計算は
準確定石にレベルダウンしようかと思います。中盤AIでの話ですが。

今FFO#40が9秒台なので、あと3〜5倍高速化したい。
0330310垢版2015/09/15(火) 20:18:36.71ID:egtjjW0V
準確定石の計算って実は思ったよりコストフルかもと気づいてしまい、
急きょコーディングして比較してみる事にしました。

releaseモードだと、自分の計算方法では跡形も残らないため、時間計測不可能。
debugモードでも、数十倍速いと言う結果になりましたので、今の確定石計算ロジック
は、悪いモノではないと自分に言い聞かせる事にしました。

それより、回帰の学習で、少しずつ少しずつ250回くらいまで学習進めていたのですが、
バグを見つけてしまい、またやり直しです。むむむ。しかも、なおした事で計算時間が
2〜3倍になってしまうという。
0331名前は開発中のものです。垢版2015/09/19(土) 00:46:12.58ID:OgvQcqwn
回帰がやっとまともっぽいところまで収束するようになりました。
今、250回学習で、最終ステージが1σ=7.5程度です。
このペースだと、もっと学習させても、たいして変わらない気もしますが、
もう少し学習を進めてみようかと思います。

この評価関数を元に、反復深化+MTDF+negaScoutなsolverを動かして
FFO#40で8秒程度になります。インライン関数化とか、最終2手展開とか
やるべき事はある程度やっちゃったので、自分の力だとこの辺が限度かも。
0332310垢版2015/09/22(火) 22:15:30.40ID:70n8Fwqa
回帰は地道に学習中。もう少しやってみるって感じだけど、収束状態の誤差が大きいのは
ステージ分割でオリジナルな変な事をしているからじゃないかと気になりだした。
あと数百回学習を回したら、通常のステージ分割版も作ってみるかなと。

色々いじってるうちに、FFO#40が6.2秒まで来た。何が良かったのか良くわからない。
反復深化をターゲットに改良しているんだけど、negaScoutも同じ時間。

FFO#41を試したら、反復深化で45秒弱、negaScoutで30秒弱という結果に。
探索ノード数がすごい事になってるので、反復深化のmoveorderのどこかがおかしい
気がしている。
0333310垢版2015/09/25(金) 16:54:56.15ID:9OkLc3+M
回帰のステージ分割というかスムージングを、ネット上でノウハウ公開されてるみなさん
と同じようにしたら、1σで6を切ってきた。やっぱ、スムージングやり過ぎて、精度が
落ちていたのね。同一ステージ内でも値がばらついているので本当に必要なのか、
気になるので、落ち着いたら両方試そうかと。先に方向性見ちゃったから本来とは
逆順になっちゃうけど。

色々頑張ったら、FFO#40が5.1秒、#41が20秒、#42が18秒となりました。
ソースとにらめっこしてれば、ネタはそれなりに出てくるものだなぁと。

しかし、10年前のCPU使ってるThellにようやく勝てた程度。
Zebraの速さは何なんだと。こちらはcore i7だというのに。

目下の悩みは、_mm_popcnt_u64とBitScanFoward64が使えずに、それぞれ32ビット版を
使っている事。外部依存のところで関数の存在は確認しているんだけど、「そんな名前ない」
と出てくる。Cは趣味のAVRで小さいプログラムしか作った事がなかったけど、VC++くらい
巨大になると、どーもよーわからん。
0334310垢版2015/10/04(日) 01:12:59.97ID:+bDErzEp
色々やって、FFO#40でnegaScoutで3.4秒まで来ました。

反復深化は異なる方法で2種類作ってみたけど、FFO#40程度の深さだとnegaScoutとの
差が出てこない。22手とか24手とかまで行くと、差が出てくるように感じるけど、後回し。

どうしても気になって、Zebraのソース解説(日本語)を見つけて、そこに出てるソースを
見ました。自分なりにロジック面で工夫した事はほぼ同じ事をやっている。流石。
あとマクロを多用してる。僕はインライン指定でコンパイラ任せ。
マクロにするとデバッグが極端に大変になるので、マクロ化するのは最後。

そしてaspiration windowと称しているWindowの取り方が独特で、ここに高速化の
秘密があるとみた。早速真似してみると、また>>310のような問題が・・・
今回は前より理解が進んでいたため、2点修正して解消。
副次的に>>310の問題も、直ったと思う。

が、もう一つ答えを間違うケースを見つけてしまった。
今まではルートノードに問題があったけど、こちらはもっと下位ノードで戻り値がコンタミ
してる感じ。デバッグが難しく、重症っぽい。むむむ。
0335310垢版2015/10/07(水) 17:10:37.74ID:i7/9rua6
デバッグで試しに変えた箇所を戻し忘れたりして、二次災害三次災害を出して、
相当混乱したけど、やっぱり境界問題だった。これmoveorderの順によって出ない
可能性もあるので厄介。自分は開き直って、探索の幅に-1つけてるけど、皆さんは
どう回避しているのかなぁ。

zebraのwindowの取り方は、基本的にMTD(f)みたいに置換表利用を前提とした、
固定分割サーチだけど、negaScout(MTD(f)やzebra方式の中で使用している)と
速度的には同等な感じ。最初の探索で勝敗がわかるという点がメリットなのか。
MTD(f)は評価関数が正しくないと、検索時間が伸びる可能性があって、以前から
negaScout単体でも十分な気がしてる。

FFO#40は後述の静的評価関数を判明しているパラメータで最適化すると、
negaMaxで5秒台。negaScoutで3.4秒前後。MTD(f)で2.6秒前後。
ThellさんのHP記載よりは高速化したけど、zebraにはまだ勝てないというか、テストした
FFO#41〜#43ではzebraの高速度合(ノード数の少なさ)が突出している。

ノード削減はmvorder用の静的評価関数に掛かっている。静的評価関数のパラメーター
をいじってるけど、FFO#40最速のパラメータとFFO#43最速のパラメータが違い、#43用は
#43ではノード数を半減できるのに、#40では増えて遅くなってしまう。negaMaxで初段の
評価順見てると、まだまだなので、何か別の発想で並び替えが必要な感じ。

評価関数は1000回くらい回してようやく良い感じになってきたけど、まだ収束しては
いない感じ。学習係数はもっと大胆に大きくしても良かったかな。ここまでやると、
スムージング無しを試すのが億劫になってくる。

反復深化は、ソースのメンテが追い付いていないので、一回破棄。
0336310垢版2015/10/12(月) 23:43:49.17ID:ZTwsIi7y
色々やってるけど、FFO#40では速度向上はほとんどなし。
置換表のサイズが見えて来たので、1件ごとにmallocしていたのを、配列にして一括で
領域確保するように変更(当初の形)したら、速度のバラツキがだいぶ減ったように思う。
NPSが変動すると、何か悪いことしかたと悩んでしまい、修正して二次災害を起こすので
地味に大事かな。

FFO#43は多少高速化してて、パラメータ最適化するとMTD(f)で12秒台くらい。置換表
適用範囲の指定を下(葉)からしていたのを、上(ルート)からに変えた。あと、MTD(f)
などでは何回も置換表を読むので、2回目からはmoveorderに置換表の評価を使うよう
にした。

BITBOARDだと開放度の計算が簡単だという事に気づいて、静的評価関数に使ってみた
けど、現在使用中の次手mobility+αの順序より劣る感じ。+αが角とか×とかなので、
序盤から中盤用なのかなぁ。

negaScoutに加えた修正をnegaMaxに適用していたら、negaMaxがおかしくなった。
直して計測したらFFO#40が40秒程度に。冷静に考えると、これが常識的な速度だと思う。
前回の5秒台がどこから出て来たのか、今となってはわからない。前段の+α箇所も
結構変えていて、negaMaxはmoveorderで露骨にノードが増減するので、奇跡的な順序
が実現できていたのか。それともバグやオペミス勘違いかも。

そろそろ本格的にネタ切れ。この辺が限界かなぁ。
後回しにしていた修正箇所を直して綺麗になったら、中盤に行くかな。
0337310垢版2015/10/14(水) 23:51:46.51ID:V3YF/mde
negaMaxはmoveorderの修正漏れでバグってて、直したらやはりFFO#40で5.4秒でした。

MTD(f)は2.4秒でzebra並になったけど、#41以後は3〜4倍時間がかかる。
その差は探索ノード数に比例してる。前向き枝刈使うわけにはいかないし、#41以降の
差を詰めるにはmoveorderしかないと思う。

とはいえ主だった事は一通り試してしまった。むむむ。

偶数理論で思いついた方法が純粋に面白そうなので組んでみる。
想定では、速度が結構遅くなるはずなんだけど、まあ面白そうという事で。
0338310垢版2015/10/16(金) 10:24:07.38ID:Q2afyb0d
偶数理論の関数は思いのほか軽くできて、オーバーヘッドの心配が少ないです。

BITBOARDの空マスを、囲まれて独立している塊ごとに分離してBITBOARD配列にして
返す関数を作りました。これをPOPCountで数えて着手した場所が偶数空エリアなのか
奇数空エリアなのかを判定します。

最初にテストしたFFO#43のMTD(f)でいきなり30%近く高速化して「やった!」と思った
のもつかの間。実はミスで判定を逆にしてまして、偶数マスに打って奇数を相手に渡すと
加点になってました。で、いろいろテストした結果、最初にやったケースではたまたま
良かっただけみたい。例えばnegaScoutやnegaMaxでテストすると、係数変えたり判定
方法に工夫を加えたりいろいろしてみても、何をやっても探索ノードが増えてしまう。

自分はオセロ弱いので、必勝法みたいに言われているものが、アバウト的に最善手に
近い手を選んでくれるんなら、並び順の優先順位計算に、あるウェイトで入れてみようか
的に考えるだけでした。意味とか深く考えるよりやってみるという感じでした。が、最後に
残った2つの空所が偶数と奇数とかの例ならわかりやすいけど、空所が4〜5か所ある
ような状況で偶数理論を当てはめようというのが間違いなのかなぁと。

あと、薄々思っているんだけど、テストケースとしてFFOは良くないんじゃないかと(汗
FFOに最適化してると、もっと出現頻度が高い例題でより高速化できる可能性を放棄
しちゃっている事にならないかと。
0339310垢版2015/10/17(土) 09:29:41.90ID:uZH1KzRS
最終2手高速化したあたりから、ノード数が過小になっていたので、それを直しました。
自分のと比較すればよいかと思って放置していましたが、そろそろちゃんと比較しようかなと。
結果、探索ノードが思っていた以上に多かった事、そしてNPSは9〜11K出てるので、
NPSを落としてノード削減する余地があるという結果に。

あまりテストしていなかったFFO#41と42ではzebra方式と呼んでいた(後述)方法が、自分の
中では最速で、MTD(f)の結果があまり思わしくない事も。MTD(f)の#40は初期条件が良か
ったからの模様。

ここらへんでもう一度、zebraサイトのFFOテストページにあるcomplete logなるものを見て
みると、全然違う。バージョン違いなのか、やってる事が全く違う。

浅い探索をしてfを決めてNull window search(正確には幅3なので正解が判別できる)
を繰り返しているように見える。けど、ログ上に%が出てきて、98%、99%、%無しみたい
になっているので、何らかの方法で前向き枝刈しながら、評価値を求めていき、最後まで
幅3の探索しかしていないのかな。こういうのをPVSって言うのかな。

浅い読みとか、前向き枝刈とか絡んでくるんなら、中盤探索をやってから戻ってきた方が
よいのかな。。
0340名前は開発中のものです。垢版2015/10/19(月) 09:50:52.09ID:BMJ9Bhec
とりあえず、ざっくり中盤探索のnegaScoutを組んでみた。
素の状態で10手読みくらいなら1手10秒以内に終わりそうな感じ。

だけど、いろいろと気になる点が。
とり同一局面から着手可能な手の評価値の順番は、あまりくるっては
いないように見える。ただ、評価値事態は結構ずれている。

そして、黒番白番で精度が全く違うように見える。
言われてみれば、同一局面でも手番が逆転すると評価は全く変わるからなぁ。
今は、手番も一つのパラメータにしちゃってるから、その差異は埋められない。

パラメーターとか評価関数の区分とか再考の余地があるんじゃないかと。

前向き枝刈するにしても、評価関数がフィックスしないとダメじゃないかと。
というわけで、しばらく評価関数方面で時間つぶしかなぁ。
0341名前は開発中のものです。垢版2015/10/26(月) 09:44:35.41ID:uWG/Yjb0
中盤探索に入るにあたって、評価関数の計算の試作をいろいろしているんだけど、
いまいちぱっとしない。100回学習で1晩かかるし、300回試行くらいしないと傾向が
見えてこないので、時間がかかる。

で、仕方ないので、裏で序盤定石を作り始めてしまった。
こちらも棋譜ベースで作ろうと考えている。

そこまで来た時に、データベースのどういうデータが使いたいのかが、逆にはっきりして
来て、今使ってる360万件棋譜の中のデータを選別しようかという方向に傾きつつあります。

が、やっつけで作って中身が思い出せないフォーマット変換のプログラムから直さなきゃならん。
開き直って、もう1度、データ変換から作り直そうかなと・・・
0342310垢版2015/10/30(金) 17:31:41.23ID:uxyAnbEX
棋譜ベースで序盤20手の定石DB作った。
定石DBは置換表をベースに作ったので、検索は速いけど、容量が大きい・・・。

簡単にαβで20手探索してみた。
ネットで調べた定石集に載っていない手筋が出てきてしまった。むむむ。
5手目までエビ系で、しかも石差+2で黒勝ち。棋譜が偏っているのかな。

棋譜は例の50万棋譜計画の奴で10手目、20手目以降を訂正したというデータ。
明らかに壊れたデータが入っていたりと、何かと使いにくい箇所があるデータだけど、
定石DB作るにはこの量でも足りないのかも。

定石探索用の簡易版minMaxを作りながらつらつら考えていたら、終盤探索の
moveorderをもっと良くする方法を思いついた。評価関数の精度次第だけど。

新評価関数は、途中でうっかり仕込んだバグで遅延。ようやく原因が見つかって、300回
試行まで来た。もうちょい収束させたいけど、テストに使える程度にはなってると思う。
0343310垢版2015/11/08(日) 00:32:40.41ID:LMw8+3qF
moveorderを早くする方法というのは、事前に軽く探索した手順を保存し、その手順から
優先して探索するというもの。理論的にはscout missがゼロになる。
探索した手順を取り出す仕組みが必要になるので、その辺を改造しようと思ったところで、
悪い癖が出てしまいました。Cベースのソースを一旦棚上げして、C++ベースのクラスを
利用した形で一から作り直してしまいました。

moveorderの配列をvectorに変えたり、unordered_mapを見つけたので置換表に使って
みたり。置換表は、システム任せにして動的にメモリ確保に行かすと、探索ノードの減少
以上に速度低下して使えない。最初からある程度メモリ確保させようとしているんだけど、
いまいち設定がわからない。動的にメモリ確保するので、速度のバラツキも大きい。

そもそもC++は初めてなので、目的がオセロからC++というかunordered_mapの習得に
なりかかっていたので、一旦棚上げして、配列ベースの自作ハッシュの置換表に戻る
方向にしました。

とはいえ置換表を外してもnode/secが5kくらいしか出ていないので、実装が悪いところもありそう。
というわけで完全に寄り道しちゃってます。
0344310垢版2015/11/12(木) 16:56:19.10ID:4hPfHY6k
ようやく、C++ベースの終盤探索(negaScout)が、Cベースより若干速くなりました。

・unordered_mapの速度のバラツキはデバッガー上限定。
実行ファイルでも多少ばらつくけど、メモリ効率&メンテナンス性からunordered_mapを採用。
・探索した確定手順を返す方法の検討で苦戦。
negaScout+置換表では原理的に無理と認識するのに時間を要しただけでしたorz
置換表無しnegaScoutかnegaMax+置換表では、後者の方が高速。
・確定手順を元にmoveorderする改造の効果は限定的。
moveorderで先頭にする処理が重い模様。適用範囲を狭めて行くと1〜3手で同等の速度。
・ハッシュキー生成簡素化で若干速度アップ。
・その他、細かいスピードアップ。

確定手順の導入で50%以上速度アップを目論んでいたのですが、無駄な努力でありました。
一応、与える確定手順の数はマクロ定義で可変できるようにしてあります。

評価関数も修正を加えたいので、データ変換部からまた作り直しです。
目標も無しに同じ事2回やるのは面倒だなぁ。
0345310垢版2015/11/19(木) 14:23:44.03ID:W/V+CKXD
定石部分もクラス化が終わりました。クラスなんての扱うの初めてなので、もうちょっと
綺麗にできたかなと思う面もありますが、C++習得が目的ではないので。

終盤確定読みは0.05秒刻みで速度アップ。FFO#40で2.3秒になりました。

今まで、速いプログラムでは30手目くらいから勝敗判定を始めると言う記述を読んで、
なんて速いんだと思いつつ、何に使うんだろうと思っていましたが、ようやく腑に落ちました。
オセロというゲームは勝敗だけが問題で、勝つんなら2石差で十分。「少なくとも負けない
手」というなら、(-1,0)のNull windowで探索してβカットされた手を選べば良い。評価値は
不定(これより良いという値)でも負けない手であるという点では「確定」手順です。moveorder
が正確なら、極端に石差を減らす手も選ばない。これなら現状でも25手ちょいくらいは行けそう。
ただ、これは勝勢の時の話で、敗勢の時の評価値は「これより悪い」という数字だし、
逆転は相手のミスに期待するしかなく、相手も同等のロジックのAI相手だと必敗となる。
結局定石段階で勝負がつく事になります。

今、定石DBは30手を前提に組んでいますが、31手目から勝敗判定ができるんなら、定石
を外れない限り中盤探索が不要になり、定石から外れた時にのみ中盤探索が必要になる。
つまり中盤探索は対PC戦では重要度が低く、定石が切れたら、即、終盤探索が始まる。

そもそも評価関数が良ければ、中盤もあまり深く探索する必要がないわけで。
深く読む意味って、なるべく評価が正確なステージを使いたいからなんだなぁと。

というわけで、次はそろそろ中盤探索です。Multi Prob Cutの英語論文を読まねばならぬ・・・。
0346310垢版2015/11/21(土) 00:05:47.02ID:WWzrsUCT
定石DBを使って30手目まで着手した盤面の予想石差が2で勝ち判定だったので、
試しに31手目から勝敗判定をしてみました。

(-1,0)のNull windowで7分30秒ほどで解けました。
(参考)勝ちと引き分けを区別するために(-1,1)で計算すると9分30秒ほど。
探索ノード数がintではオーバーフローしてしまった・・・。

これから、33〜4手目(残り26〜7手)くらいで、10秒程度で解けると予想されます。
勝勢ならこれで良いのですが、敗勢の時は、初段がβカットされないので10倍程度
時間がかかる。そうすると、残り25〜6手目くらいが勝敗読みの限度かなと。

もっと高速化が必要なのか。それとも、何か発想の転換ができるのか。
0347310垢版2015/11/23(月) 21:01:42.47ID:24rahmZ0
ProbCutとMultiProbCutのBUROさんの論文あらかた読み終えました。
最初、MPCの方から読んでちんぷんかんぷんだったので、ProbCutを読んで、
戻って来て、ようやく実装のイメージが湧くところまで来ました。
というか、この発想に至る道具立てや考え方は、既に揃ってた感じ。例えば>>323とか。

これ>>345-346の勝敗判定の高速化に使える気がする。相手側の手番では
前向きカットしないようにすれば、相手の反駁手を見逃さないからいけるんかなと。
あまり深い読みで使用するとパラメータ作りでしばらくPCを占有しそうだけど。

カットペアは結構アドホックに決めているのかな。各組合せを総当たりで調べても、
σにそんな差があるとは思えないし、特異的に良い組み合わせがあるとも思えないし、
むしろ読む深さの差が増えるにつれてダラダラとσが大きくなって行くだけじゃないか
と思う。毎深さごとにMPCしてもオーバーヘッド負けになるだろうし、再帰的に使う事を
考えたら、2^n+αで4,8,12,16,20,24ってな感じで良いのかな。
0348310垢版2015/11/25(水) 22:32:57.73ID:APRE5Y1F
条件を決めて簡単にMPCパラメータの計算プログラムを作って検証してみました。

30手目の時点(深さ30)の時の浅い探索0〜10手でMPCパラメータを計算してみました。
例の300万件棋譜の30手目以後完全読み(らしい)190万件ほどのデータからランダム
に200件ほど抽出して使用。

結論)δが10石、R-2が0.7未満という状態で、とても使えたものではないという事に。
ただ、35、40、45手目時点からのカットを試す価値はあるかも知れない。

一方、30手目の時点で、深さ10の探索に対して、浅い探索6までで計算すると、
浅い探索4手でδが2石、R-2が0.931、浅い探索6手でσが1.5石、R-2が0.962
程度と、まずまずの結果に。これが、論文通りの使い方。

当たり前だけど、こちらは十分使えそう。ただ、結局深い探索に対して浅い探索の深さを
決めるのに、全パターン試すしか無いという。まあ、BUROさんのマネしちゃえば良いけど。

あと、中盤読みのプログラム、やっつけで、終盤探索の手順作成用の浅い読みプログラム
転用したんだけど、これnegaMaxなのよね。negaScout+MTD(f)にするなり、もう少し、
素の高速化をしないとパラメータ計算が大変。
0350310垢版2015/12/02(水) 23:21:25.70ID:Xp/MZwxE
とりあえずMPCの仕組と終盤探索用のパラメータだけ作り、終盤探索と勝敗判定に
適用してみました。

勝敗判定は31手目から。浅い探索は残り手数の1/3。T=1.5で時間短縮が微妙な感じ。
終盤探索はFFO#40でテストしたところ、T=1.5だと途中で正解着手がカットされている
模様で、T=2.0で正解。T=2.0だと時間変わらずみたいな微妙な結果に。

もう一度、MPCの論文を良く読んでみましたが、どちらかというと評価関数の精度の差
の方が大きい様子で、もともと標準偏差が倍近いので、そこを何とかしなきゃならんと。
論文を良く読むと・・・評価関数に確定石はおろか、mobilityも使っていない。使っている
のは、パリティー(手番)だけで、ここは自分の方が精度が良い方法のはず。という事で、
急きょ評価関数の説明変数をパターンだけにして再計算に着手しました。
とはいえ、書いてある学習係数があまりに違いすぎるので、自分がバグってる可能性も。

また、ネットでBUROさんのパワポ資料(2002年)みたいなのを見つけて読んでみると、
「selective endgame search」と称して、MPCの終盤探索への応用がサラっと書かれて
いて、「いまどきの強いオセロプログラムはみんなやってる」との事。iterative deepingを
前提にしているのでmoveorder作成で使ってるのかなぁ。正解着手だけ与えても速度アップ
は限界があり、正解以外着手のnull window searchの時間がバカにならないので。

あと、中盤探索は(17,5)というカットペアの記載あり。zebraのFFOのログでは中盤探索が
2.5kNPSなのに対して、僕のは250MPSと、速度が1/10なので・・・深さ17はしんどいかなと。
ちょっと期待しているのは、前述のとおり確定石計算を評価関数で使用しなくなったので
その分は速度アップしていないかなぁと。

評価関数の再計算を始めてしまったので、しばらくは中盤探索が動かせません。
というか、本当にLRの計算があっているのか、バグは無いのか、不安になる…
0352310垢版2015/12/04(金) 23:35:12.62ID:DNSRUk3b
結局、確定石が評価関数の誤差の大きさと、収束性の悪さの原因だったみたいです。
前半から中盤はmobilityのウェイトが大きそうなので、とりあえず復活させてみました。
あと、スムージングは、あるステージで出現しなかったパターンが隣接ステージにある
可能性も考慮し、ウェイトがゼロのパターンを減らす目的もあるようです。

実際、200試行ちょっとでかなり誤差が減ったのですが、FFO#40で試すと途中の評価値
のバラツキというか、極端に0に近い局面が現れて、2σ以上の差異が簡単に出てしまい
ます。そこで、ちょっとだけスムージングを入れて、かつデバッグ段階ではウェイトゼロの
出現をアラームできるように改造しようかと思っています。

評価関数の重要性を痛感しています。しばらくは、ここで悩む事になるのかなぁ。
最低でも300試行するとなると3日かかる。
0353310垢版2015/12/05(土) 23:27:03.86ID:VLRyPTJJ
モビリティーも収束悪化の原因でした。
確定石の数にしても、モビリティにしても、ある程度大きな数字が出るものがダメっぽいです。

評価パターンとウェイトを確認できるようにして、FFO#40〜41の完全読みに登場する盤面を
チェックしましたが、ウェイトゼロのパターンは出現していないようです。

評価値が大きくぶれるところがありますので、スムージングを入れてみて計算開始です。
0354310垢版2015/12/07(月) 10:00:41.29ID:JSVZKjkd
スムージングも外してみたら、Buroさんの論文なみ(か、それ以下)のσが出そうな
感じになってきました。収束が良いのでβも大きくできたし、その後の計算でも工夫を
入れたので、Buroさん論文みたいに300回試行で十分なレベルになりそうです。

ウェイトゼロのパターンはありました。FFO#40の50手目のCORN2x5に1つ現れます。

現在selective endgame searchがどんなものなのか、想像を膨らませています。
iterative widening endcutのイメージがなんとなくつかめてきました。
ソースを探して見ちゃえば早いんだろうけど、面倒だし、想像だけで頑張る。
MPCが動いたら、solver改造して、本当に速くなるのか確認する。
0355310垢版2015/12/10(木) 23:16:49.62ID:lQAJMVKx
結局、評価関数は1000回試行までやってます。
β・1/Nでやってるけど、それだと収束が遅いので、100回試行ごとにβを倍々に。
1000試行目で発散するステージが出たので、βを下げて最後の100試行を実行中。

その間、反復深化などで使えるように、置換表を改造。前回評価範囲をmoveorderで
再利用します。いちいち消しているとメモリ解放で時間がかかるし、全データを入れたまま
用途をキーで区別すると、使用時に選択する事になりオーバーヘッドが気になるので、
一番新しい評価値をひたすら上書きし、置換表として使用する時のみ、今回探索か
区別するようにしました。moveorderで若干割り切った作りです。

同時に中盤探索(MPCなし、反復深化)をちゃんと作ってみました。MPC計算で、結構深い
深さまで探索する予定なので、反復深化が上手く機能するようなMPC計算ロジックを考え
ようと思っています。

それができたらiterative wideningのテストをしてみようと思います。
0356310垢版2015/12/11(金) 22:32:36.55ID:c1YdnEjo
あちゃ。ウィンドウ幅1でiterative wideningやると、正解着手もβカットされた手も
置換表の値が全部同じになって、次の探索でmoveorderが意味なしになって、
速度が大幅低下する事が発覚。

仕組み考えないと・・・。
0357310垢版2015/12/13(日) 23:14:55.34ID:RUGsIY6w
一応回避したけど、MPCの速度向上は限定的。
中盤探索というか評価関数が驚くほど遅いのだろうという結論に。

放置していた中盤探索の素の高速化に入ります。
1か所ネタはあるんだけど。
0358名前は開発中のものです。垢版2015/12/18(金) 00:28:56.19ID:ht2BaviT
中盤探索で2か所改良して、速度は2倍にアップ。まだzebraの6掛け程度の速度です。

終盤探索のiterative wideningを想像しながらテストするも、いまいち速度向上が望めない。
MPCのカット基準を緩めながら(widening)、置換表にmoveorderを貯めていく事でβカット
をどんどん起こさせて、最後の完全読み時点ではほぼ完ぺきな順序に並び変える事で
高速化を実現する方法だと想像しているんだけど、違うのかなぁ。

そんなこんなでやけくそ気味に、浅い探索(11手読み)+negaScout(-∞,+∞)を試したら
FFO#40で1.93秒という最速タイムが出てしまった。MPCもMTD(f)も意味なしorz

#41,#42もこの方法でかなり高速化したけど、それでもまだzebraの方が速い。
0359310垢版2015/12/20(日) 17:21:06.88ID:UpZkem/K
中盤探索で改良をしたらかえって遅くなるを繰り返してます。

で、やけくそ気味にmoveorderの「置換表がない時」の計算値を、簡素化してみたら
中盤探索の速度そのままに、終盤探索部分の探索ノードが減少して高速化。
終盤探索部分も同様に簡素化したら、FFO#40で1.75秒以下になりました。

それでも相変わらず#41/42はzebraがずーっと早い。

で、MPC使うと遅くなる理由を考えていたら、いま使っているMPCのセットは終盤探索用に、
残り手数と浅い読みのセットを独自パターンにして計算した奴だと言う事を思い出した。
深い探索のスコア=終局のスコアとなり、深い探索が不要になるので。

中盤の高速化するネタももう出てきそうにないし、先に進むか・・・
0360名前は開発中のものです。垢版2015/12/23(水) 11:41:36.91ID:Acs4Om0o
iterative wideningって詰め碁用のアルゴリズムっぽいけど違うの?
310の言ってるのってただのAspiration Searchか何かに見えるけど

てか置換表にmoveorderを溜めるとはどういう意味だ
0361310垢版2015/12/23(水) 16:26:13.00ID:MLtsaD3t
どもです。
Buroさんのパワポっぽい資料に名前しか書いてないので中身がわかりません。
わかっているのはMPCと併用するらしいことくらいです。

iterative wideningで検索すると確かに碁の関連の英語論文がヒットしますね。
関係なさそうだと思って放置していましたが、ちょっと見てみようかなぁ。

置換表云々は、僕の想像です。
αβを前提にしたアルゴリズムで高速化するネタの一つに、moveorderを工夫して
βカットが起きやすくするってのがあると思います。

反復試行する際、置換表には前回の評価の範囲が入っています。
それを今回探索のmoveorderの並べ替えに利用しようというものです。
反復深化なんかと同じ考え方です。

逆に言うと、反復を前提としたアルゴリズムで高速化するネタが、それくらいしか
思い浮かばないのです。
0362名前は開発中のものです。垢版2015/12/23(水) 20:37:25.92ID:Acs4Om0o
ああ、オーダリングに以前の探索の結果を置換表から引いて使うってことか
置換表に順列か何かを放り込んでいくのかな?とか思ってしまった

bitboard + NegaScout + 置換表 + MPC + 評価関数とマージンの学習
をやってるっぽいのはわかったけど、とりあえず定番どころは全部入れてるのかな

NegaScoutで最初のノードを探索するときに、
探索窓を(-inf, inf)で探索せずに、前回の評価値eを使って
(e - d, e + d)で探索して、失敗したときに限り窓を広げて再探索するのがAspiration Searchだけど
もうやってるかな
あとCPUのSIMD命令使ったり、並列化したりとかはめちゃ効果でかいよ
0363310垢版2015/12/23(水) 22:38:37.71ID:MLtsaD3t
>>362
ご助言ありがとうございます。

MPCはまだ途中ですが、そんな感じです。
終盤n手高速化の類もしています。中盤探索だと葉に近いところで置換表外すと、
著しく速度が低下するので、最後まで置換表を使っています。

で、中盤の速度がいまいちで12手読みくらいが実用範囲って感じです。
MPCでd計算に100棋譜くらい試して一晩で計算できる範囲は13〜14手くらいが
限界な感じです。そろそろMPC計算しちゃおうかと思いつつ、まだ悶々と中盤探索で
どこか高速化できないかトライ中です。

SIMD命令はコンパイルオプションでそれらしい場所があったので、設定してみましたが、
速度変わらずで放置しています。どうやって使うものなのでしょうか?
そもそも、組込関数のpopcountとかbitscanで64ビット版が使えずに放置してる状況です。

並列化はMPCが終わって、一通りオセロの形にしてから、次ステップで勉強しようかと
思っています。

アスピレーションサーチは、1σは±7〜8手なので試しに±8の幅にしてテストしてみた
ところ、確かに若干高速化できている様子です。mtd(f)は下から寄っていく時はβカットが
効くのですが上から寄っていく時は遅いので、一発目で探索できる確率を上げつつ、
ある程度幅を絞るには、このくらいがちょうど良い感じですね。
0364310垢版2015/12/24(木) 20:33:24.09ID:zDiJT168
ちと調べてみました。SIMD命令はx64でコンパイルしている時は、設定しなくても自動的に
使うようになっているみたいな説明を見つけました。

並列化とかベクター化とかもコンパイラが自動でやってくれるみたいですが、レポート出し
たら確かに一つも対象になっていませんでした。評価値算出とmobilityの2関数は、なんか
効きそうな気がしますので、少し悶々とトライしてみます。

また、_mm_popcnt_u64と_BitscanFoward64は、今やってみたら、何故か使えました。
色々とコンパイラのオプションをいじったのが原因かなぁ。謎。
多少速度アップした模様です。

アスピレーションウィンドウはdの計算しなきゃと思っていましたが、よくよく考えたら、
評価関数の計算時の誤差ログが残っていますので、そいつでパラメータ作成してみます。

と、久々にFFO#43まで時間計測したところ、#43で答えが違ってる。
数か月前に最終2手高速化をいじった時にバグを仕込んだ模様です。
調べようとdebugモードにしたら64ビット組込関数が使えない。
やっぱりコンパイルオプションのどこかみたいですが、わからない。

だんだん問題が発散してきて、頭の切り替えが追い付かなくなってますorz
0365名前は開発中のものです。垢版2015/12/24(木) 20:53:24.01ID:DG4HDn4P
pop_cntはめちゃめちゃ速度上がった経験あるが(三割アップ)
オセロだとそうでもないのかな。
0366310垢版2015/12/24(木) 22:56:29.36ID:zDiJT168
_mm_popcnt_u32()はすでに使っていました。u64が使えなかっただけです。
u32→u64で3〜5%くらいの高速化になっています。

困った事に、debugビルドの側では、まだ64bit版が使えていません。
debugを使いたい時は32bitに直さないといけない。
コンパイルオプションをいろいろ見比べていますが、どこなのかいまだにわかりません。

#43は最終2手なのか1手なのか、どちらにバグがあるのか切り分けようとして
ソースいじっているうちに直ってしまいました(汗)。
0367名前は開発中のものです。垢版2015/12/25(金) 15:25:23.28ID:skIhqDAd
>>364
コンパイラの自動ループ展開(あんま賢くない)に限らず、
手動でAVXだのSSE命令だの使えるところは使ったらという話

あとMPCは本質的に前向き枝刈りなので、過激に刈りすぎると答えがずれる可能性はあると思うけど
(バグの原因は当たりがついているようなので関係ない気がするが
0368310垢版2015/12/26(土) 11:23:54.66ID:2a5cp76f
どもです。バグったところはMPC使って無い箇所でした。

コンパイラの自動ループ展開は上記2か所で試してますが、なかなかうまく行きません。
なんとか依存関係を解消してループ展開強制すると劇的に速度低下する状態です。

その代り、いろいろググっていたら、BMI命令を見つけて、BLSIとPEXTを使ってみました。
速度バランスが変わったのでパラメータで置換表適用範囲を狭めるなどもしましたが、
FFO#40で1.55秒前後まで高速化できました。中盤探索も高速化はしているはずですが、
数%程度の改善というところでしょうか。まだ50%は高速化したい状態です。

色々アドバイスいただいたお蔭で、ようやくSIMDまわりの使い方がわかってきました。

ここまで来ると、BITBOARD操作の関数の見直しをしたくなりますね。
中盤探索の一番重い部分なので。
0369310垢版2015/12/28(月) 10:45:49.88ID:i0yT273K
デバッグモードでu64系の関数が使えない件、解消しました。

MTD(f)に代えてアスピレーションウィンドウを採用しました。
中盤探索は、隣の評価値をたどっていくと、かえって遅くなるのでnegaScoutだけで
探索していましたが、これでMPC計算が多少高速化できそうです。

MPC計算はまだしていません。反復深化でどのくらいの深さの探索で、どのくらいの
件数なら実用的に計算できるか試行しています。14手読みまでは行けそうですが、
15手だと厳しいかなぁという状態。20手付近では盤面によっては、探索ノードが爆発的
に増えて、時間のバラツキも大きいです。

また、FFO#40-44の完全読みを計測しました。zebra比で#40は圧勝、#41-42は引き分け
ですが、#43-44は完敗。理由は#43-44は正解となる初手が2つあるためで、#43は10秒
以上かかってます。むむむ。
0371310垢版2015/12/29(火) 02:31:09.04ID:F/Ba7yoX
ちょっと一括変換操作を誤って大変な事になっていました。一通り直していたところ、
FFO#40で1.45秒程度が出るようになってしまいました。多分、修復がてら置換表登録・
検索関数の変数の並びを、整列したのが効いたのだと思っていますが、びっくりポンです。

前回課題の正解着手が複数あるケースですが、MTD(f)のような評価値決め打ち系の
探索では、ぴったりの答えが見つかった時点で、ほかの手を探索する必要が無い事に
気づき、直してみたところ、FFO#44は速度アップしました。が、#43はまだ駄目です。
とはいえ、#43は浅い探索の評価値が外れすぎて時間がかかっているような感じなので、
浅い探索の深さを残り手数で調整すると直りそうな気がしています。

あと、FFOテストの全データをテストできるように登録しましたが、#59を見て、はたと、
途中全滅時のスコア計算が違う事に気づきました。自分のは一番単純なアメリカルール
です。ここを直すと、確実に時間が遅くなるような気がしますが、明日直してみます。

てな事をやって、一晩に0.1秒(比率にして7%前後)も短縮していると、まだなんか
やる事があるんじゃないかと・・・。
0373310垢版2015/12/29(火) 10:25:40.74ID:F/Ba7yoX
って、βカットしない事を確認しなきゃきゃいけないから、ぴったりの答えがあっても
全手を探索しないとダメじゃん。すんません。
0374310垢版2015/12/29(火) 10:52:28.77ID:F/Ba7yoX
>>372
やったりやらなかったりで、いろいろ比較して試してます。

MTD(f)では、ワーストケースではウィンドウ中心が評価値の最少単位で動く関係で、
1石以下の少数計算をする中盤探索では、よけいに時間がかかる事が多いです。
そのため、アスピレーションウィンドウ導入前はただのnegaScoutにしてました。
終盤探索は、最少単位が1石になりますので、許容範囲です。

MTD(f)もアスピレーションウィンドウも、所詮本チャンのnegaScoutを呼び出すための
ドライバーにすぎないので、どちらも用意して、何かの折に速度比較しています。
今回は、ボツりましたが、ぴったりの値が見つかったら後の探索を省略する際には、
MTD(f)の方がマッチングが良かったので、そうしました。

ボツになりましたので、またアスピレーションウィンドウに戻りましたが。

#40ではzebraよりはるかに高速化できましたが、#43など遅いケースでは、数倍の時間が
かかります。こういうタイプの時間差は、単純な高速化じゃなくて、何らかのアルゴリズム
の違いがあるのかなと想像しています。
0375310垢版2015/12/30(水) 00:01:33.75ID:lfikhn/D
結局、本日は探索速度アップばかりやってました。

中盤探索というか評価関数の計算でBMI2命令を徹底的に使ってみました。
また、ボードの回転操作系も見直しました。
10%程度は高速化できたと思います。でも、期待したほどではなかった。
あと、速度アップするなら、ボードの対角線転置かなぁ。あと効果は微妙だけど、180度
回転がビットオーダーの逆転なので、これも何か組み込み関数があったらうれしいなと。

終盤探索では、FFO#59問題に対処。
スコア計算の修正と、全滅など64石の差がついた時に、βカットと同様に後続の探索を
パスして時短。minMaxで言うところのα値の更新があり得なくなるからです。

浅い探索が11手だと3秒程度で解けるのに、15手だと60秒かかったりと、いまいち動き
に納得がいかないので、まだ何か問題があるかも知れません。

中盤探索をあと50%は高速化したいなぁ。というか、zebra見てるとできるはず。
0376310垢版2015/12/31(木) 21:04:10.05ID:i5TR43+g
2015年の年の瀬は、MPC計算のメモリーリークの原因探しで更けていく・・・
置換表クラスあたりっぽいんだけど、デバッグの仕方が良くわからないという・・・
0377310垢版2015/12/31(木) 23:46:42.84ID:i5TR43+g
ギリギリ12時前に直った。
メモリリークではなく、不正なアクセスでした。
多分直ったと思う・・・

来年の抱負は、MPCの計算をする事と、GUIを作る事です。
元々VBのGUIからDLLで呼び出すつもりでしたが、なんとなくC++でやってみようか
という気になってきています。
0378310垢版2016/01/03(日) 11:08:48.54ID:3YPfF+nL
バグは解消してました。なんとも不可思議な事になっていました。
スタック領域を破壊していて、破壊された箇所がたまたまdepth(残り探索深さ)だったため、
探索深さがマチマチになってました。計算時間やメモリ使用量が異常になる以外は、そこそこ
それっぽい探索結果が出ていたため、メモリリークだと思ってしまったという。

中盤探索の置換表適用範囲も、ちゃんと効くようになって深さ11〜12まで置換表を使用
するのが効果的と出て、探索値のバラツキもそこそこ揃って、探索時間も予想できる範囲に。
メモリ使用量も安定しました。

ある棋譜に対し、20手目から終局まで順に、深さ1〜17の探索を、反復深化を活用しながら
探索値を求めるプログラムを用意して、14棋譜を対象に実行したところ凡そ7時間で完了。
速度的にはこんなものかなぁという感じ。もっとも、深さ17だと結構、探索時間・ノード数の
バラツキが大きいので、10件前後だと終了時刻もバラツクはず。

とりあえず、棋譜からランダムに10件程度を抽出し、この探索結果を貯めていくところまで
作りました。トータル100件程度集めれば、MPCパラメータ計算には十分だと思う。
探索結果を貯めてあるので、毎晩10件くらいづつ追加し、直説法で都度パラメータ再計算
して精度を上げていく事ができる。
0379310垢版2016/01/04(月) 22:22:10.63ID:1p46+Vgy
MPCのための探索データ蓄積の間に、並列処理について調べてみました。
VC++だとopenMPとPPLってのが使えるみたいです。
?concurrent_unordered_mapが便利そうなので、PPLにしよううかなと。


で、脳内コーディングであれこれ考えていたら、AIの中でBoardクラスを参照渡しして、
差分型で盤面を進めたり戻したりしているのが、とても並列処理と相性が悪い事に
思い至りまして・・・。コピー型に戻して、何をクラス化するのかとか見直してみようかと
言う事に。

多分数日がかりになるかなと。
0381名前は開発中のものです。垢版2016/01/05(火) 01:07:47.45ID:UyX0E5Wd
自分の場合は将棋作ってて、並列にしたけどstockfishのソースとか参考になるよ
スレッド待機させてノードの終わりの方で判定して、OKなら分割させて
そこで上でも言われてるけど、盤の情報をコピーして走らせるの

自分は盤面作成とか更新巻き戻しなどを最初スレッドとか考えてなく直にアクセスしてて
全てポイントにからに変更するのが、かなりだるかった
0383310垢版2016/01/09(土) 02:12:28.10ID:GhyCVx1P
どもです。

とりあえず、コピー方式に変えてましたが、変にバグを仕込んだりして、時間がかかって
ました。ようやくデバッグもあらかた終わったのですが、まだ原因不明・解釈不能な速度
差があって、終盤探索のみ速度が10%以上低下した状態です。
というか、コピー版を書きながら気づいた箇所を、ボードクラス版にも反映すると、ボード
クラス版が高速化して、差が広がるという。
で、クラス版がFFO#40で1.40〜1.42秒になりました。

>>380さん
おっしゃる通りですorz

プログラム直しながら、ネットでVC++の解説をつまみ読みしながらのコーディングに
限界を感じたので、オライリーさんの出番という事で、アマゾンに本を数冊注文しました。
到着待ちの間にやるなら、適当に作っていったクラスの整理統合かなぁ。
あと、openMPのお勉強。
0385310垢版2016/01/10(日) 01:14:26.88ID:F6Uvkb4b
うわ。色々やり方あるのね。
VC++だとPPL、openMP、std::threadか。

PPLについては、逐次処理のまま置換表で使っているunordered_mapをconcurrent版に
変えてみたところ、置換表付探索の速度がおおよそ半分になってしまったので、結構
微妙な印象を持っています。
とりあえずopenMPでどこまでできるか試してみて、気に入らなかったらstd::threadで
細かく制御できないか考えてみます。

先ほど、コピー版で置換表登録に影響するバグ発見。直したところ、FFO#40が1.26秒
とかになってしまいました(汗)。不可思議な速度差の原因はこれで間違いないと思います。
edaxまであと10倍の速度アップかぁ。並列化で3倍くらいまで詰められないかと期待。

一応、Boardクラスのポインタ渡し版(差分方式)も試してみましたが、今のところ、若干
速度低下しています。もともとの差分方式は、Boardクラスを継承したAIクラスのメンバ
関数として実装してます。
これらの一見無駄な作業も、バグ探し&逐次探索の速度アップに有効だったという事でorz
0386310垢版2016/01/11(月) 20:31:40.39ID:IrhGHm3u
とりあえずopenMPで並列化トライしてみましたが、コンパイル中に内部エラーになる。
ネットで見ると最適化オプションがらみらしいけど、なんかよくわからなかったのでパス。

PPLを使って、とりあえず並列化のテスト。オセロでは標準的と思われるn段YWBCに
してみました。forループみたいな特定の形ではPPLは結構簡単という印象。

バグは一通りとれた状態だと思いますが、FFO#40で1.25秒が0.85秒程度になり
30%強の高速化。あと少しだけソース修正するつもり。

使ってるパソコンは2コアでした。昨夜まで4コアのつもりでいましたが(汗)、2コアなら
こんなものなのかな。
0388310垢版2016/01/13(水) 13:02:44.01ID:Yd1pcfW8
どもです。

コア数2だと、理屈の上では2倍近くまでは速度アップできるのかなぁと思います。
一般的にはどのくらいの倍率をターゲットにしているのでしょうか。

YBWCの適用のパターンをいくつか試しましたが、タスクマネージャーで見たCPU使用率
は、ほぼ100%になってるので、単純にはスピードアップは難しい感じがしてます。
PPL自身のオーバーヘッドなのか。
PPLは楽ちんだけど、チューニング箇所がなさすぎな感じ。

あと、YBWCやってる以上、YBの着手をmove orderingする意味が無い感じなので、
sortが一つ省けるかなぁというところ。ルートに近いので、あまり効果は無いと思うけど。


ここまで来ると、8コアのパソコン持ってきたら・・・
SIMD拡張命令だBMI命令だを使っておきながら、コア数2で頑張るのもどうかみたいな。
0389310垢版2016/01/16(土) 09:10:45.76ID:mjTPCiWE
PPLはMicrosoftのDeveloper Networkくらいしか情報が無いので、ひたすらリンクを
たどって情報収集してますが、ほとんど機械翻訳で、結局カーソルあてて英文読ま
ないと意味が分からないという・・・

で、排他制御とかいい加減にしていたノード数カウントなどをきちんとして、ソースの見易さ
と効率を上げようと色々と細かく修正。combinableとかcritical_sectionとかInterlockedとか。

と・・・思ったら・・・中盤探索で確率10%程度で違う答えが返ってくる・・・
並列探査のバグはわかりにくくて時間を食ったのですが、どうもcombinableの動作が変。
期待した動作をしていない。でも、情報が無さすぎで、どこを直せば良いのかわからず、
結局同等の機能を動的配列にしてしまった。
0390310垢版2016/01/16(土) 11:37:48.70ID:mjTPCiWE
中盤探索を1万回程度回して、違った答えが返ってこない事を確認できました。

ノード数カウントはInterlockedIncrementを使っているんだけど、やはり排他待ちロスが
大きいようで、ノードカウントありだと0.8秒前後、無しだと0.7秒前後になる。
使えなかったcombinableみたいな形にして、一つの再帰関数内はローカル変数で加算
して、最後にまとめて1か所で排他加算するようにしてみようかな。

並列タスクの起動順で、探索ノード数が違ってくる関係で、実行時間のバラつきが±0.5
秒くらいになっている。
0391310垢版2016/01/18(月) 09:54:27.64ID:ED4vwFCp
結局、ノード数・リーフ数カウントは、戻り値を構造体にして返す方向にて検討。
普段の探索には不要だけど、solverだと表示したいので。
これで完全にローカル変数になり、排他ロスを気にする必要がなくなる。

デバッグ用の置換表回りの統計は、所詮デバッグ用なので、一旦全削除。
必要になったら、こちらは#ifdefで囲って、排他加算する。

で、構造体の形であれこれ悩んでいたら、戻り値をクラスにできる事に気が付いて・・・
あらためてC++すげーと感心中。

けど、かなり全面的な修正になるので、時間食ってます。
まずは中盤探索を修正して、ノード数がおかしくない事を確認。
終盤探索の修正はこれから。探索を使う系の統計処理も変更しなきゃならないけど、
MPC以外は、次いつ使うかわからないw
0392310垢版2016/01/19(火) 00:13:53.27ID:Dh1WPUXC
終盤探索の修正完了。

0.8秒±0.05秒と、結局、Interlockedでグローバル変数のノード数を加算するのと、
大して時間が変わらないか、もしかしたら微妙に遅くなったかも。元に戻すのが面倒
なので、他で改良点を探すしかないかなと。
0393310垢版2016/01/21(木) 10:04:20.88ID:c00KCFqr
YBWCでは、最適着手手順(PV)のラインで置換表でmoveorderする意味が無いという事
を突き詰めていくと、いちいち前回探索の置換表を引くループを回して、都度最善の着手
を求めるのではなく、前回探索で得たPVを渡せば、時間が短縮できそうな気がしてきま
した。ツリーの浅い部分なので、全体にどれくらい効くのかはわかりませんが。

また、浅い探索などで最適着手手順を取得する時、negaScout+置換表だと正しいscoutmiss
が発生した時に、nullサーチ時の置換表が適用されて、それ以後のPVが得られないという
事で、悩むところではあります。

まずは戻り値の構造体でPVを返すように改造して、効果を見たうえで、YBWCを適用する
深さでnegaScoutをやめてnegaMaxにするか、それともnullサーチは置換表適用外とするか
どれが良いか試してみようかなと思っています。

できるだけ高い位置で並列化した方が良いという指摘と、置換表もなるべく高い位置で
効かせた方が良いという指摘の、どちらを優先するのかですね。置換表はばっさり探索
をカットできるけど、並列化はカットせずに時短するので、置換表優先かなという気もして
いますが、高い位置でどれくらい置換表が効いているのかもわからないですし・・・。
0394310垢版2016/01/23(土) 01:31:00.95ID:0OQfWIYl
パソコン再起動すると、何かのタスクがCPUを30%くらい占有してしまいます。
昨日まで快調に動いていたのが突然遅くなって、悩んでいましたが、これが原因のようです。
というわけで、本日は色々改変したソースの速度が計測できずに悶々としてました。

色々すったもんだ挙句、PVラインを渡す形にしましたが、効果があったかどうかは微妙。
色々付け足した事で生じた速度低下はペイしたかなぁという感じで、#40で0.78秒前後。

本格的にネタが尽きて来たので、ここから先は、MPCをきちんと実装してiterative widening
にかけるしかないかなぁという感じです。あと、定数で渡している置換表適用高さなどの
パラメータを、空マスや使用条件で作ると、実用的になるかな。
0395310垢版2016/01/27(水) 01:18:29.98ID:IVwAw5rN
オライリーの並列化本が来たので拾い読みしながら並列プログラミングの勉強。
PPLの各アルゴリズムが何を目的とするものなのかが、少しずつ分かってきました。
抽象化度が高いので、最初のとっかかりとしては良いかも。何故かcombinableが
上手く動かないとか、parallel_reduceの中身がよく分からないとかありますが。

で、並列化できるところを探して速度が上がるか試したり、同じ処理をより綺麗に書き
換えしたりして、微妙に速度アップし、0.70〜0.75秒くらい、ノード数が15M、NPSが21M
nps程度になりました。たまに0.68秒台が出ます。

Edax4.3のFFOベンチの結果を確認したところ、ノード数で1.5倍、NPSで4倍、計6倍の
差があります。NPSをコア・クロック換算しても1.5〜2倍の差があり、ノード数は別として、
まだ速度アップの余地があるのではないかという事で、単品速度アップに走ってます。
ノード数はMPC導入後のiterative wideningである程度追い付けるかなと淡い期待。

いくつか速度アップネタがありますが、サッカー日本代表見ながらでははかどらず。
続きは明日。
0396310垢版2016/01/29(金) 11:31:08.14ID:trvaxUQ+
先日の速度アップネタはすべて不発でしたが、その際にノード数のカウント漏れを見つけ
て、修正したところ、ノード数は17〜8Mという感じでした。その際に、最終2手高速化の
箇所でもカウント漏れがあり、まずは正確なノード数を簡便に把握しようと外してみたところ、
意に反して速度低下しないところか、どうも微妙に高速化したように見えまして(汗。

最終3手高速化を試してみたり、最終1手高速化も外してみたり、moveorder適用とか、
そもそもmobilityを求めずに空マスを順に着手してみるとか、その辺の適用深さを変えて
みたりいろいろとやって現時点の最適パラメータにしてみたところ、0.63〜0.68秒、最速で
0.60秒が出るようになりました。

αβカットの効きが悪くなっているため、ノード数は24〜25Mとなりました。
その分NPSは37〜38Mと速くなっていますが、こんな方向で高速化してて良いのか?
というわけで、ノード数が違う段階でNPSを比較しても意味が無いという事に気が付きました。
0397310垢版2016/01/30(土) 20:51:37.62ID:yCKBToEa
囲碁がすごい事になってますね。オセロで一通り勉強したら小さい盤の囲碁をやって
みようと思っていたので、モチベーション低下中。とはいえ、ああいうのをオセロに応用
しようとしたら、あそこまでマシンパワーいらないんじゃないかとか・・・。

ここのところ、もっぱらSTLやPPLの機能を綺麗に使う方向での改良ばかりしてました。
pararell_reduceの使い方もわかりました。negaScoutの繰り返しループが綺麗に並列化
できたんじゃないかと。ただ、MAPする件数がしれているので、parallel_reduceではなく
逐次版のaccumlateの方が速いという結果に。あと、時間計測が結構飛び飛びの値に
なるので時間計測関数を精度1msのものに変更。

色々やった結果、若干高速化したうえで、時間のバラつきが消えてくれました。
100回試行で計測すると610ms±15ms(1σ)となり、逐次処理のほぼ2倍の速度に。
ノード数は同程度で、NPSは40M超えて来ました。このNPSのままノードを半減できれば
良いのに。
0398310垢版2016/02/07(日) 21:48:19.14ID:xNqeS9Ve
ここら辺で、EDAXとかとの速度差の原因を考えたところ、次の2点が考えられました。
1.評価関数の精度が悪い可能性
2.個々の関数で速度アップの余地がある可能性
という事で、1は熟考が必要なので後回しで、速度アップの対象として、flipとmobilityの
高速化を検討。とはいえ、良い知恵があるわけでもないので、ネット徘徊。

現在、ポインタ関数で分岐して処理しているflip関数を1発で処理するopenCLのソースを
発見。Master Othelloの作者のものでEDAX4.3のflip関数を参考にしているらしい。
中身を解読するとベクターを使っている。とりあえず処理を真似て逐次処理で組んでみたら
結構速度アップしました。

解読の過程で、ようやくベクタ化の意味がわかったので、mm256系の命令を使って、
ベクタ化してみましたが、若干速度低下。原因は恐らくlzcntで一回ベクタを抜けてしまう
所だと思うので、ハッカーのたしなみを読んでベクタ演算で組み直してみる予定。
合わせてmobility関数もベクタ化。若干速度アップしたかなという程度。
組み込み関数は使い方が面倒臭いので、演算子のオーバーロードしまくってみました。

flip関数は非ベクタの分岐無しバージョン、mobilityはベクタという状態で、500msを切る
数字が出るところまで来ました。flipのベクタ化ができて、パラメータ調整するともうちょい
良い数字が出るかなと期待。
0399310垢版2016/02/09(火) 01:09:41.58ID:MeGl+gwc
flip関数続き
・lzcntを自前で組んでみましたが、やはり処理が重く速度低下。ボツ。
・右方向と左方向で処理が違うので、片側+180度回転で、同じ処理にしてlzcnt不使用
にしてみたが、180度回転×4が重くて速度低下。ボツ。
・できるところまでベクタ化して、lzcnt以後はスカラ計算で、速度若干改善。
・上記からlzcnt後、再度ベクタ化してみたら、速度若干低下したのでボツ。
・64bit×4の値を代入する関数を変更したら、意に反して結構速度改善。
・闇雲に__declspec(align(32)) してみたら若干速度改善してバラツキ減少。

これらにより、450msくらいになりました。
ベクタ化はまだ何かありそう。

ちゃんと書いてなかったですが、途中からノート数カウントを外してます。入れると100ms
程度の速度低下になります。一応、デバッグ用に#ifで切り替えられるようになってます。
が、そんな状態なので、nps計算に意味が見いだせないという・・・。

続いて評価関数をベクタ化できないか考えましたが、BMI命令使っているので厳しい。
計算楽にするため、でかい配列を何回も引いているので、ここを何とかしたい気がする。
黒・白・空の3を基数とする3進数でナンバリングしているんだけど、高速で計算する方法
が見つからず。
平衡3進法を手早く計算する方法があると、黒を1、白を-1、空を0にして、定数足すとか
できるんだけど、どんなに調べても、基数変換に王道なしという言葉しか見つからない。
0400名前は開発中のものです。垢版2016/02/15(月) 00:14:34.50ID:2rfyeFpJ
高速化については一旦棚上げ。何やっても速度が上がらない。
ひたすらノード数カウントの速度低下を抑えて、カウントのバグ取りして。
色々発見はあったけど、結局ソースを綺麗にしただけだった。
後は、いずれゆっくり時間をかけて、評価関数を作り直すかな。

MPCを組みました。一応動作している模様。

これからしばらく、GUI作りに入ります。
MFCよくわからん。
0401310垢版2016/02/20(土) 13:43:08.30ID:ZGi2V8ih
GUIできた。昔作った序盤定石部分と合体。
中盤探索を反復深化にして、3秒を超えて新しい深さに入らないあたりで調整。
MPCで25手くらいまで読めるように調整。
終盤完全読みは38手から。36手からMPC付で完全読み(つまり完全ではない)。

こんな感じでできたので、早速プレイ。自分だと軽く全滅負けしてしまうので、zebra先生
にお越しいただきました。が、滅茶苦茶弱い。

良く見ると、定石が効いている段階で+16だったのが、中盤読みになった瞬間に一気に
−14くらいまで落ちて、そのまま挽回できない感じ。zebra先生は、その前に定石から外れ
て、既にzebraから見て+14程度の評価値を算出している。つまり、定石部分がおかしい。

それ以外は、評価値もzebraとは大きく違わないし、終盤探索もちゃんと機能している感じ。
0402310垢版2016/02/20(土) 23:06:47.33ID:ZGi2V8ih
zebra先生にならって定石の評価を表示するオプションをつけてみました。
ロジック的には間違いなさそうですが、定石DBがおかしいというか、定石に登録がない
手順に正しい変化があって、それを無視しているため、間違った判断をしているみたい。

一応、完全読みという触れ込みの棋譜を元にしているはずなので、使い方をどこかで
勘違いしているんだと思います。しばらく悩むしかなさそうです。
0403310垢版2016/02/21(日) 01:04:17.33ID:nPWuqcvw
試しに定石部分を外して、中盤探索で開始してみたら、zebraの20手読みに対して
2戦して1勝1分となりました。読みの深さは、こちらが上なので、こんな感じでしょうか。
序盤20手分は評価値が無いので、20手近い探索を反復無しで探索するため、MPCを
使っても最初の数手は1手あたり5分以上掛かってしまいます。

定石については、以前にウェブで見つけてテキストに起こした定石データがあるので、
それを評価0で登録してみようかなぁと思っています。

定石の自己学習とか、評価付けとか、どうやるんだろ。
0404310垢版2016/02/25(木) 21:06:56.39ID:fXRsnvrs
定石データを、上記の手打ちデータで作り直しました。
当初は並び取りとかの極端な進行以外は評価0.0にしたため、mobility関数のビット列
の下から定石に従って着手する形となり、zebra先生のBookに誘導されるように、少しずつ
不利な定石に乗り換えていき、負けるという展開に(汗

悔しかったので別のソフトを拾い、戦ってみると、そちらには圧勝。決して弱くはないと思う。
また、zebraとの対戦時にBookで評価値がついているものは、それを参考に修正したところ、
時々勝てるような感じになりました。

EDAX先生+UnifiedBookなるものを拾って、そちらと戦ってみたところ、軽く惨敗。
fjt定石とかだと終盤近くまでBookがあるみたいで、Bookが続く限り紛れが無い。
こちらが中盤探索などでミスるたびに−2づつ落としていき、お話にならないレベル差を感じました。

しばし熟考の上、定石の拡張、評価付けを考えてみようかと思います。
あと、評価値が近い時には、何らかの確率で手を選択するようにもしてみたいと思います。
0405310垢版2016/02/28(日) 01:10:48.52ID:hQzoi2Tz
縦取り系は白番黒番試して、定石の評価値を修正してみました。
あと、AIの進行ごとのパラメータを試行錯誤して、なるべく負けないようにしてみました。
これにより、AIの読み時間が結構伸びて、1ゲームワーストケースで1手2分、トータル
5分くらい思考してしまいます。これは、反復深化などで、タイムアップをせずに、次の
ステップに入る制限時間だけ決めているためです。

EDAX+Unified Book先生はレベル21で、黒番白番ともに引き分けになります。
こちらは20手前に定石が切れていますが、その後も最善手が打てているという事になり
ます。こちらは何局打っても手を変えないので、EDAX先生のBookの進行に合わせた
だけですが。一方zebra先生は比較的手をいろいろ変えてくるので、勝ち負けが発生します
(もちろん、各アプリの設定次第ですが)。

序盤定石の評価値をそれなりにしたら、後は引き分け進行をひたすら登録していって、
相手が最善しか着手しないと信用すると負けないプログラムができちゃうのではないか
と、ふと思いましたが・・・。トップ同士の対局が引き分けばかりになるのは、こういう事
なんでしょうね。というか、完全解析ってこれが完成した状態なのか。

EDAX先生のUnified Bookは、いくつかの引き分け進行棋譜の集合体のようですが、
元データが幸い既知のWthor形式なので、それをもらってしまうと、トップレベルになる
のかなぁ。トップな人がBook構築に主眼を移したり、開発が止まったりする訳だと。

そろそろ、混とんとしているプログラムを綺麗に直して、パクリBook作って開発終了しちゃ
おうかと思い始めています。速度的には、まだまだ改善の余地はありそうですが。
0406じょげなら ◆kXDiHQuNQ2 垢版2016/02/29(月) 19:18:07.19ID:etqtABZA
ライフゲーム囲碁というゲームのネット対局場を作りたいです。
囲碁でいうKGSみたいなのが理想です。
プログラムはある程度わかりますが、ネット関連の知識が乏しいです。
何から始めればいいですか?
0409406垢版2016/03/01(火) 20:52:33.32ID:6wFQeZGp
とりあえずHTML5の本買ってきた
0411310垢版2016/03/04(金) 10:15:09.55ID:Q4DtXsqP
>>410
一晩考えてみた。

通信回りに興味を持って遊んだのは15年くらい前だし、Javaとかイメージしかないし。
あまり助言できる事はありませんが、一つ言えるのは、UIに凝ったりサービス内容を
考えたりするのは最後で良いと思います。

Rubyが好きなら、まずはCGIベースで、テキスト表示で対戦を実現する仕掛けを作る事
だと思います。次に複数のユーザーが接続するのであれば、身元確認のためのID/パス
ワード管理が必要になりますし、個々の対戦を区別するにはセッション管理が必要になり
ます。この辺は、スタンドアロンのアプリには無い、独特の世界なので、結構新しい技術、
テクニックの習得が必要になるかと思います。いまどきあるのかわかりませんが、チャット
のスクリプトとかあれば、参考になるかも。

その辺から入り込んで、いろいろ調べていくと、だんだんと必要な技術、知識が増えてくる
んじゃないかと思います。
0412406垢版2016/03/04(金) 18:58:38.77ID:w3YPuhPg
>>411
レスありがとうございます。
確かにセッション管理とか知らないです。
チャット調べてみます。
0413406垢版2016/03/07(月) 21:05:27.22ID:NI+TTWmM
RoRの本買ってきた。
チャットはまだ調べてない。
0415310垢版2016/03/10(木) 02:00:10.79ID:hvbQwbFh
うむむ。
これにて、オセロができたら次は囲碁という目標が雲散霧消してしまいました。

どうしよう。
0416310垢版2016/03/10(木) 18:05:03.79ID:b1SmaPOg
AlphaGO強すぎ・・・orz

今夜は、囲碁関係者だけじゃなく、AI周りの人も、Google以外全員お通夜ですね。
0418名前は開発中のものです。垢版2016/03/11(金) 09:04:36.30ID:HTdTU0Fi
浮上
0422310垢版2016/03/13(日) 20:47:23.70ID:50OeMIN8
うむ。なんか期待を裏切られっぱなしw

この負けっぷりを見ると、囲碁もトライしたくなってくる希ガス。
0423406垢版2016/03/15(火) 20:44:49.53ID:NF77F+OG
RoRとjavascriptの連携がよくわからん。
でもちょっとづつだけど進んでる。
0424310垢版2016/03/16(水) 23:06:52.43ID:YEZK1fac
アルファ碁ロスまっただ中ですw

オセロ作ったおかげで、一連の勝負をいままでとは違う視点で見れたかなぁ。
とりあえず、囲碁のモンテカルロ解説した本と、ディープラーニングの入門書を
買ってきた。さらっと読んだけど、ディープラーニングは理解に時間がかかりそうorz

オセロで3層パーセプトロンを試したときは、結局うまく動かなかった。
実装が悪いのもあるけど、学習にもすごく時間がかかった。
あれをディープにしたら、どうなっちゃうんだろうかは不安ではある。
こちとら、SurfacePro3しかないし(汗
0425406垢版2016/03/19(土) 20:06:25.11ID:Ik15FlWh
railsでdeviseとかいうgemをつかってユーザー認証機能実装したけど、
複数ユーザーがログインして対局させる方法がサッパリわからん。
0426406垢版2016/03/24(木) 20:20:54.97ID:C08ak5N3
ブラウザ閉じたときに自動ログアウトのやり方がわからん
0427名前は開発中のものです。垢版2016/03/25(金) 13:51:48.34ID:9Ea9sx62
ブラウザは通信があった時にしかクライアントの消息が確認できない。

n分アクセスが無かったらサーバー側で勝手にログアウトさせちゃう
タイムアウト方式が普通かなと。その時間経過後にアクセスがあっても
ログインからやり直し。

このログインからタイムアウト(ログアウト)までの間をセッションと呼ぶ。
0428名前は開発中のものです。垢版2016/03/25(金) 14:16:19.46ID:9Ea9sx62
1行目おかしかった。

>WEBサーバ、ブラウザという仕組みは、ブラウザから通信があった時にしか、
>サーバーはブラウザの消息を確認できない。

に修正。

1.初画面からログインする
2.サーバが、HTMLにセッションNoを埋め込んで、ブラウザに表示。
  サーバでは、セッションIDを配列などで管理して、IDと最終アクセス時間をとっておく。
3.ブラウザ側からのCGIリクエストには、必ずセッションNoを入れて送信。
  セッションNoで、相手がだれか(ID)を特定して、処理を行う。
  つまり、個々の処理はセッションNoで管理されている。
4.ブラウザからCGIリクエストが来た時に、タイムアウトしていたら、ログアウト処理へ
  あと、ゴミ掃除で1日1回くらいタイムアウトしているものを削除。

この辺が基本。対局型の場合。

5.2つのセッションが対局している事になるので、対局管理する配列を用意。
6.相手の着手待ちの時に、どうするのか?その辺が肝。
  HTMLに細工して、1秒ごとにリロードさせる。リロードにより、着手が行われたか
  それとも秒読み時間切れになったか?判断をサーバーに依頼する。
  などなど。やり方は色々あるかと思う。

とにかく、肝は、情報がブツ切れで、あちこちにある事。これにより、サーバーで簡単に判断
ができない事があるので、いくつかの機能をブラウザスクリプトに依頼しなきゃならん。
それでも、相手が放置して逃げた時、ブラウザを閉じて逃げた時(回線切断やPCダウン)、
などなどの例外が起きるので、それらをタイムアウト検出などで拾わにゃならん。

どうするのかなどの、例外処理をリストアップして、一つずつ対応を決めていく事。
プログラムテクニックはどうとでもなるけど、例外事象の拾い上げの方が大変。
0429406垢版2016/03/25(金) 17:43:19.31ID:/V6G/Eic
丁寧にありがとうございます。
javascriptのwindow.oncloseからなんとかならないかといろいろ調べていましたが、無理筋なんでしょうか。
タイムアウト検討してみます。
0430名前は開発中のものです。垢版2016/03/26(土) 21:27:54.24ID:DUGO8n57
>>429
そういう事を考えるんなら、Javaアプレットとか、ActiveXとかの、
ブラウザ上で動いて通信できる方法を試した方が良いかもね。
0431406垢版2016/03/30(水) 21:45:07.64ID:yYbYes7U
すいません、教えてください。

4.ブラウザからCGIリクエストが来た時に、タイムアウトしていたら、ログアウト処理へ
  あと、ゴミ掃除で1日1回くらいタイムアウトしているものを削除。

このゴミ掃除というのはサーバー側がクライアント側から何のアクションも受けずに
能動的にタイムアウトしているセッションをみつけ削除するということですか?
どうやって書けばいいのかわからないのですが…
0433406垢版2016/03/31(木) 20:31:39.10ID:dkaj1Oq1
>>432
手作業ですかうーん。
まあ、頭の片隅に置いておきます。
ありがとうございます。
0434名前は開発中のものです。垢版2016/04/01(金) 19:52:02.46ID:JLskKsZt
隠しコマンド受け付けるようにしておいて
管理者のクライアントから定期的にコマンドを投げればいい
0435310垢版2016/04/05(火) 10:45:13.03ID:82XTVDoH
久々登場。アルファ碁ロスがでかすぎて、やる気がでないです。

とりあえず、BOOK上で乱数入れて手をばらけさせるようにしました。あとの課題は、
1.持ち時間制度
2.ステータスバーの更新
標準のStatusBarだとOnMouseMoveなどで更新されるとの事。
リアルタイムに更新させるためには、マウスくるくるさせてなければならん。
3.中盤探索の高速化
反復深化+置換表で高速化が効いていない懸念があるけど未確認。その他の高速化検討
4.同じ手順で負けないためのBOOKの自動学習
5.オフラインでの引分手順の自動生成
となります。けど・・・本当にモチベーション上がらない。

時々、気が向いた時に、Zebra先生やEDAX+UB師匠相手にポチポチ手打ちで対戦して、
相手のBOOKに登録されている引き分け手順を見つけて、手入力でBOOK更新してます。
Zebraは研究モードがあるので、ほぼ拾い終わりましたが、逆に引き分けだらけになりました。
EDAX+UB相手だと、こちらが定石から外れるケースでも、EDAX側は学習データで先が
見えていて打ってくるので、ほぼ負けになります。

たまに、EDAX+UBも中盤探索が走ってくれて、極まれに勝勢になる事がありますが・・・
何が腹が立つと言って、そういう時に限って完全読み時にEDAXがバグって、既に石がある
所に着手して逆転した事にされます。もちろん反則なので勝利は勝利ですが、すっきりと
勝たせてもらえないのが腹立たしい。をのれ。

というわけで。やはりオセロは、引き分け手順のリストアップが、強さの肝である事も再確認
してしまいまして。そこまでの根性は無いなぁというのも、モチベーション低下の原因。
0436406垢版2016/04/06(水) 22:31:38.47ID:SXJnF3U3
ログインユーザー一覧表示できるようになりました。
RoRのコーディングは一休みして棋譜管理にとりかかろうと思ってます。
SGFをパクろうかとおもってますが、結構難しい orz.
0437406垢版2016/04/08(金) 22:18:30.78ID:kkoRA2nm
棋譜ツリー表示すんの結構メンドクサイような希ガス
いいライブラリはないんか
0438406垢版2016/04/09(土) 23:59:42.58ID:SBv5rCvL
KGSのレーティングシステム難しい。
まだそんなこと考える段階じゃないけど。
0439406垢版2016/04/11(月) 21:25:49.37ID:A4FL2sT8
javascriptでオブジェクトの比較ってjsonで変換してそれを比較しろとか某ページで見たけど
そんな事せにゃならんの?
0441406垢版2016/04/16(土) 22:59:10.60ID:MXucFBba
Rails側とjavascript側の連携がやっぱわからん。
色々めんどくさすぎ。
0442406垢版2016/04/23(土) 00:16:56.63ID:Gce7F8Ms
エンコード間違えてて動かなかったわ。
railsがログ吐いてくれてなきゃ一生気づかなかっただろうな。
0443406垢版2016/04/27(水) 21:48:14.23ID:JGExYAi7
開発に使ってたノートのキーボードが一部効かなくなったわorz.
windowsにログインできなくて焦った。
アカウントでも乗っ取られたのかと思ったらソフトキーボード使ったらログインできた。
USBキーボードとかで代用できればいいんだがどうかな〜。
0444406垢版2016/05/02(月) 21:58:59.67ID:i7WwatVD
invalid multibyte character
とかってエラーが出るんだけど、どこに全角があるのかさっぱりわからん。
app/controllers/application_controller.rb:1にあるらしいんだけどいくら調べてもみつからん。
0445406垢版2016/05/02(月) 23:06:51.86ID:i7WwatVD
以下のログが出るんだけど、だれか原因わかる人いない?


Started GET "/" for ::1 at 2016-05-02 22:55:10 +0900
ActiveRecord::SchemaMigration Load (1.2ms) SELECT "schema_migrations".* FROM "schema_migrations"

ArgumentError (invalid multibyte character):
app/controllers/application_controller.rb:3:in `<top (required)>'
app/controllers/home_controller.rb:5:in `<top (required)>'
0446406垢版2016/05/03(火) 11:00:58.43ID:6pwgCgml
すいません、解決しました。
0447406垢版2016/05/13(金) 22:42:29.22ID:Zx20RSfa
やはりポーリングだけでは限界があるか?
0448310垢版2016/05/16(月) 21:32:31.63ID:KQ1qSDyb
モチベーションダダ下がりだったけど、なんとなくソースの整理していたら、
直したいところがいろいろ出て来て、見直し中。

後ろ向き枝刈で探索時間は変わらないけど、探索ノード数が2/3になった。
この枝刈手法の速度アップできたら面白いかもと思いつつ、元々自分が
結構高速に書いていた処理(未使用)を流用しているから、これ以上速度アップ
できるかわからん。

でも、EDAXには勝てないんだろうなぁ・・・
EDAXの孫情報からインスピレーション得てるネタだし。
0449310垢版2016/05/26(木) 16:01:37.05ID:ZBCA70ec
遅々として進んでいます。
ソースを一から組みなおして、いろいろと綺麗にしてます。
並列探索を入れない段階で、FFO#40が結構速くなった。

いまさらながらに、FFOテストを40〜59まで実行して比較しようとしたところ、
前から薄々気づいていたけど、FFO#41以後が遅い。酷いケースになると
探索ノード数が10倍=時間も10倍になる(#51)。自分のは指数関数的に
比較的にきれいにノード数が増加している。同じようなノード数のものもあるので、
ZebraやEdaxはどこかで上手にばっさり刈り込んでいる感じ。#52以後は時間が
かかりすぎて、未検証ですが。

ZebraやEdaxもノード/秒が一定しているので、置換表みたいな重い方法では
なく、簡単な方法で刈り込んでいるっぽい。とすると、moveorderかなぁ。
一応、MPCの99%で評価値の並び順は置換表に残してあるので、そんなに
間違った順番でソートしていないと思うんだけど。

あと、mtd(f)だと最初から最後までNullサーチしかしない事に思い至り、そこで
処理の効率化できる箇所が無いかと考えてます。Nullしかやらないんなら、
アルファ越えの再探索でウィンドウを広げる必要もないわけで。逐次探索部分
では効果不明だけど並列探索だとYBWCでPVを検索し終わるまで待つ必要が
そもそもない(仮アルファを求める必要がない)ので、多少速度アップできない
かなぁと。
0450310垢版2016/05/27(金) 00:36:10.52ID:gIFpjm1c
早々に状況が判明しました。ここに書くと進むんだよなぁ。

mtd(f)+negaScoutで繰り返し探索しながら、置換表に置換データを置いて、更に
それを並び替えに利用していたのですが、最初にPVを探索してしまうと、その後は
別の着手も評価値がαになってしまい、並び替えの意味が無くなっている感じです。
ちなみにPVだけは別ルートで必ず先頭に探索するようにしてあります。

というわけで、テスト的に初段のみ敢えて並び順を逆転させてmtd(f)を未使用にして
ただのnegaScoutで、mpc99%→全探索をしてみたところ、探索ノード数がかなり減り
ました。置換表使用の深さ全部で並び順を逆転させてみたら、mpcの99%ですら全く
終了する気配がなくなりました。

さて、どうやって実現しようかなと。
今のところ、mpcはかなり高速なので、これをnegaMaxにして。
いわゆる並び替え専用の浅い探査にしようかなと。
0451406垢版2016/06/27(月) 22:12:32.72ID:rUgIsnK8
対局場は結構難しいorzので一旦横に置いておいて
手始めにもうすこし簡単な1人ゲームからPHPで作ろうと思ってます。

具体的にはこれ

http://www.vector.co.jp/soft/winnt/game/se513226.html

の一人プレー場とランキングを作りたいです。
元ネタはコンウェイの天使と悪魔という問題みたいですね〜。
0452406垢版2016/07/02(土) 23:28:52.20ID:qo9Pciu3
http://textuploader.com/5iagw

とりあえず、HTML & javascriptでシコシコ書いてます。
だいぶ大分形になってきました。
遊んでみてください。
0453406垢版2016/07/02(土) 23:40:37.16ID:qo9Pciu3
なんか文字化けしてんなぁ
なんでだ?
まあいいか
0456455垢版2016/07/18(月) 00:05:57.51ID:Lx2YZiAH
455=406です。
0457406垢版2016/07/21(木) 23:55:32.48ID:oilR8wYn
うーんアクセスがないぜ。
検索エンジンにも引っかからないし。
SEOとかいうのに手を染めるしかないのか?
0458406垢版2016/07/27(水) 00:25:34.27ID:42/ungMS
結果を保存できるようにした。
0459406垢版2016/07/27(水) 22:44:58.98ID:42/ungMS
棋譜を登録&閲覧&再生できるようにした。
そろそろ宣伝かな〜。
0460名前は開発中のものです。垢版2016/08/01(月) 12:39:59.89ID:BFi+UVWj
このようなスレがあるとは…
自作でオセロソフトを作成している者です
現在は自己対局による学習中です
初手f5
以降ランダム7手〜8手、
中盤8手読み
中盤で次善手を85%の確率で一手のみ打つ
終盤20マス空き読み切り
で300万棋譜集めようかと
この設定であれば一局1〜3秒程度なので2ヶ月半くらいで達成できる予定です
まだ86万局程度ですが、今のところFFOはこんな感じです

FFO#40 (a2:+38) 1.36sec FFO#41 (h4: +0) 3.75sec
FFO#42 (G2: +6) 4.86sec FFO#43 (C7:-12) 6.33sec
FFO#44 (B8:-14) 9.46sec FFO#45 (b2: +6) 64.88sec
FFO#46 (b3: -8) 13.20sec FFO#47 (G2: +4) 5.66sec
FFO#48 (F6:+28) 67.74sec FFO#49 (e1:+16) 121.90sec
FFO#50 (d8:+10) 376.73sec FFO#51 (E2: +6) 86.08sec
FFO#52 (a3:+0) 132.61sec
0461406垢版2016/08/02(火) 00:17:59.05ID:R38aaX9h
だれかSEOのやりかた教えてくれ。
0462460垢版2016/08/02(火) 09:44:26.07ID:/HFRnWj4
白の得点が微妙にマイナスに傾いているので9手目までランダムに固定しました。
初手はf5なので8手目までだと白の方がランダム手数多くなってしまうことに気づいて・・・
9手目ランダムだと7手目までの評価値はまともな値にならないのですが、そこはBOOKでどうにかしようかと。
まともな値にならないだけで、互角定石以外に進行したりとかはしないので、とりあえず無視します。
0463406垢版2016/08/02(火) 20:37:12.35ID:R38aaX9h
Google検索で引っかかるようになったみたいです。
でもコンウェイの天使と悪魔なんてワード検索する人そんなにいないだろな。
0464310垢版2016/08/03(水) 14:35:23.97ID:WXOcEHjz
ここしばらく、評価関数に新機軸をと、ディープラーニングにトライ中ですが、
囲碁のように、畳み込みの画像認識の応用では、なかなか上手くいかないと
言うか、自分のパソコンで手におえるくらいの規模のネットワークだと全く歯が
立たない感じです。

というわけで、色々と手はいっぱい動かしているのですが、何にも成果があら
われていない状況です。
0466310垢版2016/08/04(木) 01:59:01.51ID:XH3ZGPYC
>>465
最初はGitHUBのDeepLearningの参考プログラムを元に自家製でAutoEncoderにDropoutをつけ
たりしてました。

次にCNNで、GitHUBでtiny-cnnというライブラリを落として使用。技術的に凝りすぎライブラリで、
解読するのにC++の勉強が主になってしまいそうなので、改造はあきらめました。

そして、今は、行列ライブラリ(Eigen)落としてきて、自家製に戻りつつあります。Sparse正則化の
ために、ミニバッチ処理をしようかと思って(最初のは逐次処理のみ)、ついでにAVX2命令や
並列化対応を、この行列ライブラリに頼ろうかと思ってます。

Eigen使ったMLPでxor解くテストプログラムは、さきほどできましたが、本当にこれで良いのか、
結構不安です。多少間違っていても、収束しちゃうときがあるので。
明日はAdagradに対応させる予定。何とか2〜3層程度で収まらないかな。

パソコン環境が貧弱なので、あまり重い処理ができないのが最大の難点です。
もっとも、できあがった評価関数が重いと、探索深さが浅くなってしまうので、ある程度は妥協
しなきゃならんかなと思っています。
0468310垢版2016/08/05(金) 20:44:21.05ID:sOgjr/Uz
楽しんでやってますので(笑

で、AdagradとSparse正則化ができました。Sparse正則化は思ったより時間がかかり
ませんでした。さすが行列ライブラリって感じです。AdagradとSparse正則化込みで、
結果も、正則化もちゃんと出来てますので、多分間違いはないでしょう。

今夜はオセロ関連ライブラリ持ってきて、学習データ作って、Sparse Auto Encoder
にしてテストです。全結合層クラスを積み重ねていくだけだし、データ作成は3回目
なので、後は簡単ですが、隠れ層のノード数と、目標とする活性ノード数を色々試す
のが面倒です。

まあ、ここまで全敗なので、あんまり期待していないけどさ(汗
やればやるほどBuroさんの評価関数の凄さがわかってきます。
0469460垢版2016/08/08(月) 01:32:00.53ID:1caSYJwt
PV-LINE(最善の着手リスト)の表示を実装してみました。
PVノードの更新は非常にまれな事象ですが、あまり深い所で表示更新すると
やはり探索速度に影響与えてしまうので、6手目以下の浅いノードで表示更新しています。

あと自己対局棋譜が100万局集まったので、中盤MPCパラメータを作成中です。
現在20手読みのカットペアの計算に入ったところで、これが終われば終盤MPCの実装に入ろうと思います。
0470名前は開発中のものです。垢版2016/08/10(水) 01:12:31.39ID:BL+f+Yy5
310と460はホントに別人なのか?
ディープにオセロAIに取り組む人が2人も現れるとはにわかには信じがたいw
0471310垢版2016/08/10(水) 22:37:11.88ID:C09Nh62j
>>470
他のスレで出会って、誘導させていただきました。
ほんと絶滅危惧種ですよね(汗


Auto EncoderにSparse正則化を加えましたが、やっぱり特徴抽出は
簡単ではないようです。Auto Encoderとしては申し分なく機能している
のですが・・・線形回帰をつけて評価値を算出してみたのですが、ただの
乱数返しているような状態になります。

なんか、微妙に恒等変換を学んでいる臭いんだよなぁ。むむむ。
0473310垢版2016/08/11(木) 23:18:44.20ID:M0iE7EXH
>>472
僕は全然ハイレベルじゃないですよ。
すぐ脱線して役に立たないことばかりやってるだけです。

別スレでお互いのFFOテストの結果を見せっこしたところ、
前半5つで、速度はほぼ同じくらいでした。

>>460さんと情報交換したところ、末端ノードの高速化の
方向性が全く逆だったのが意外でした。
0475460垢版2016/08/12(金) 02:42:42.36ID:mvQ0iJdF
>>472
自分はディープランニングなどの人工知能系はさっぱりなので・・・
310さんはよく勉強されていると思います。


自作オセロですが、今まで32bitで開発していましたが
今ではもう32bitOSを使用する方が稀だと考えて思い切って64bitに移行しました。
探索ノード数がいきなり10〜20%程度上がってビックリしています・・・
0476460垢版2016/08/12(金) 04:26:50.73ID:mvQ0iJdF
あ、探索ノード数ではなく探索速度ですw
終盤探索だと10000Knps〜15000Knps程度出せるようになりました。
自分の環境だとWZebraが20000Knpsなので、大幅に負けています・・・
そろそろチューニングも視野に入れつつやっていこうと思います。
まずは探索ノード数を終盤MPCで削減しなくては・・・
0477460垢版2016/08/12(金) 07:59:35.21ID:mvQ0iJdF
64ビット移行+120万局の学習でFFOテストの結果をまとめました。
32ビット+86万局の学習だと合計が17219.7sだったので36%ほど高速化しています。
シングルスレッド動作なので、将来的にはマルチに移行したいところ・・・

OS:Win10 CPU:i5-6500 キャッシュサイズ:128MB

FFO#40 (a2:+38) 1.04s FFO#41 (h4: +0) 3.22s
FFO#42 (G2: +6) 4.01s FFO#43 (G3:-12) 13.10s
FFO#44 (D2:-14) 3.22s FFO#45 (b2: +6) 58.63s
FFO#46 (b3: -8) 10.27s FFO#47 (G2: +4) 4.60s
FFO#48 (F6:+28) 36.09s FFO#49 (e1:+16) 50.33s
FFO#50 (d8:+10) 354.14s FFO#51 (E2: +6) 59.20s
FFO#52 (a3:+0) 142.79s FFO#53 (d8:-2) 656.87s
FFO#54 (c7:-2) 1718.85s FFO#55 (G6:+0) 5588.48s
FFO#56 (H2:+0) 314.27s FFO#57 (a6:-10) 1045.01s
FFO#58 (g1:+4) 973.58s FFO#59 (g8:+64) 0.25s

合計11037.95s(トッププログラムは合計で600秒台orz)
0478460垢版2016/08/12(金) 08:01:32.72ID:mvQ0iJdF
>>477
FFO#56はH2:+0ではなくH5:+2に訂正です。。
0479310垢版2016/08/12(金) 15:16:23.38ID:USoZXJIB
がーん。今まで、こちらはノートPCだしと、密かに思っていましたが、32bitでしたか・・・。
完全に脱帽です。

だったら、僕もこのスレで教わったAVX2とかBMIとかの組込関数使って、あとPPLとか
OpenMPとかで並列化して4コアなら3倍強程度なので、トータル4倍以上に速度アップ
すると思いますよ。つまり、その辺やるだけでEdax並まで行くかなと(汗

ちなみに、DeepLearningはあきらめ方向にだいぶシフトしてきました。
0481460垢版2016/08/12(金) 17:56:57.44ID:wDmYSTDl
シングルスレッドだとトッププログラムですら合計2000秒台と限界があるので、マルチスレッド対応は必須ですよね
ただybwc等の並列化アルゴリズムの理解に時間がかかりそう…
0482310垢版2016/08/12(金) 20:50:39.55ID:USoZXJIB
>>481
YBWCはnegascoutのnull window searchを並列化して一括処理する
ようなものだと解釈して実装しました。

この辺はゲーム計算メカニズムなる本で勉強したかな。

並列処理のフレームワーク何使うかが問題ですね。
自分はVC++なのでmsdnで情報が得やすいPPLを使いました。
インテルTBBとかOpenMPなんてのもあります。
PPLは結構使いやすかったですが、速度は不明。
まあ、ルートの方でしか使わないので、あまり影響ないと思っています。

手組でマルチスレッドなプログラム書ける人には不要かも知れません。
0483310垢版2016/08/13(土) 14:18:44.65ID:D+1dBs0T
あ、考え方がnegascoutみたいだという事で。
0485310垢版2016/08/13(土) 20:47:52.09ID:D+1dBs0T
方向が8つあって、それぞれの処理を8回計算するとき、

右シフト方向が4つ、左シフト方向が4つ。
256bitは64bit×4。右シフトと左シフトで2回。

というわけで、mobilityとかflipとかで便利に使えます。
0486460垢版2016/08/14(日) 16:41:37.52ID:ALD5heTO
現在、終盤用MPCパラメータ作成中です。
23手完全読みのカットペアに入っています。24手読みの計算が終わったらいったん実装に入るつもりです。

>>310
YBWCに関して調べましたが、そうみたいですね。
MPCパラメータを作成している間に、なんとなくで適当に実装してみましたが
なぜかエラーで落ちまくりでしたw 
排他がかかっていない致命的な箇所があるのか・・・置換表は排他をかけたのですが・・・
PVライン生成あたりも怪しい、とりあえずもう少し調べてみないとダメそう。
0488名前は開発中のものです。垢版2016/08/17(水) 21:19:58.40ID:Z2gXWq7v
俺もボードゲーム系AIでディープラーニング書いてみたいと思ってるけど難しいんだろな。
論理もそうだけど膨大なデータが必要そうだし。

>>479
どのへんで諦めました?
0489310垢版2016/08/18(木) 15:43:08.07ID:7GnJQiSP
>>488
まだ細々やってます(汗

Eigenの導入と、少しづつ進んでいくC++技術のおかげで、前よりは試行の
スピードはアップしていますが、なかなか成果は出ません。まだ、色々な
パターンを試しながらディープラーニングって何ぞやを体感しているところ
なんだと思います。

少なくとも「簡単に凄い事ができそう」という幻想は捨てる事ができました(汗


ボードゲームがターン制なら、基本はmin-Maxになると思います。
まずは、盤面の状態に(恣意的で構いません)点をつける評価関数作るところ
から始めたらどうでしょう?

次のステップで評価関数に統計(線形回帰)を持ち込むと、ディープラーニング
じゃなくても、プレイ譜がたくさん必要になります。

オセロの場合は、Buroさんという先人が、実用レベルの評価関数が線形回帰
で作れる事を示してくれています。

僕がディープラーニングを適用しようと思っているのは、ただの思いつきでして。
場合によっては、より軽くて正確評価関数が作れるかと思いましたが、実際に
始めてみると、なかなか評価関数として機能してくれないし、仮にできたとしても
重いものになっちゃいそうという感じです。
0490488垢版2016/08/19(金) 23:15:11.39ID:i9HkvHw2
>>489
手動評価関数はかなり昔五目並べで書いたことあります。
min-maxで思考時間が1手5分くらいかかったけど、
自分でプレーして負かされることもあるくらいの強さにはなりました。

そのBuroさんの線形回帰とやらはWebで論文とか見れたりしますか?
読んでも多分理解できないだろうけどちょっと興味あります。
0492310垢版2016/08/20(土) 16:51:13.03ID:m44rb9b4
>>490
Buroさんが作った伝説のオセロプログラムがLogistelloです。
Thellというオセロプログラムの作者の方が日本語で解説してくれています。
http://sealsoft.jp/thell/learning.pdf

5.2の計算の高速化のところの説明(P.8の冒頭)のところ。
自分なりに解釈したら、自分が解釈違いしたのか、説明がおかしいのか、
この通りではなかった記憶があります。

とはいえ、これはオセロの考え方であって、将棋なんかだとbonanzaなどを
参考にすべきだし、全く別のゲームであったら、別な事を考えなければなり
ませんね。当たり前ですが。
0493488垢版2016/08/20(土) 20:33:47.55ID:+7ONDgCM
>>492
パターンの重みの線形和が評価関数になる的なことが書いてあるっぽいですけど、
パターンというのは人間が与えてやるわけですよね?

そのパターンすら学習で求めるというのがディープラーニングなのかと思ってますけど。
まあディープラーニングにはロマンがありますね。
0494310垢版2016/08/20(土) 21:29:23.21ID:m44rb9b4
>>493
ですです。

あと、Deepじゃなくても、2層以上のパーセプトロンだと、線形分離不可能問題の
分類ができるようになります。XORの学習が典型ですね。

ところが、パターンの部分まで学習で求めてくれるってのは、やっぱり幻想でして。
ある程度パターンを想定しながら、ネットワークを作らないといかんのではないか
という事に思い至っています。

例えば畳み込みニューラルネットワーク(CNN)で、何故畳み込みをするのかという
と、縦線横線などの隣接ドット同士もつながりを識別してもらうためですし。そもそも
畳み込みのフォワード計算自体が、画像に対して例えば輪郭線強調といったフィル
ターかけるのと、プログラム的に同じものだったりします。学習対象は、フィルターに
なります。

オセロは、囲碁とかと違って、石の色がコロコロ変わるので、隣同士の石のつながで
判断するCNN的なネットワークをそのまま適用できないよなぁというのが、最近の諦め
ポイントであります。

じゃあ、何に頼るかというと、自分はオセロ弱いので・・・No ideaだったりします。
あんな簡単な(DeepLearningと比較して)線形和でBuroさんの評価関数ができています
ので、パターンを活かして、まずはそこに点数を割り振るところをMLPなんかでできない
かなぁと思っています。
0495488垢版2016/08/21(日) 00:04:33.21ID:EnsCDbgT
>>494

>ところが、パターンの部分まで学習で求めてくれるってのは、やっぱり幻想でして。
>ある程度パターンを想定しながら、ネットワークを作らないといかんのではないか
>という事に思い至っています。

ふーむそうなのか。残念。
聞きかじった知識だと夢のような技術なのかと思っちゃったけど、
実戦してみるとなかなか難しいのかぁ。
0496名前は開発中のものです。垢版2016/08/21(日) 21:39:11.08ID:EnsCDbgT
いくらオセロの盤面が小さいからってシングルスレッドで
10000Knps〜15000Knpsというのはとてつもなく速く感じるんだが。
どうやったらそんな速度がでるんだ?
オセロ業界じゃ普通なのか?
0497310垢版2016/08/22(月) 02:41:50.59ID:2ubnBUwd
Kが余計で3桁間違えているんじゃないかと(汗
0498310垢版2016/08/22(月) 02:46:41.58ID:2ubnBUwd
あ、違った。自分が3桁間違えていた。

全然おかしくないです。自分の2コアで13000Kくらい出てます。
シングルで同等の速度ですから、かなり速いとは思いますが、
敢えて言うなら2倍程度なら縮められないとは思えない差です。
0499460垢版2016/08/22(月) 08:13:03.66ID:yZES3OuI
終盤MPCを実装完了してFFOを測定してみました。。
残すのはFFO#57のみですが、この時点で9364秒と1万秒を割ってるので
10%程度の高速化は期待できそうです。(評価テーブルは64ビット移行+120万局から変更なし)
0500460垢版2016/08/22(月) 09:20:01.85ID:qlwiS2PE
>>496
簡単な実装だと終盤探索は2000万ノード/秒いけますね。
合法手生成が将棋などより速いので。
とはいえ、中盤探索だと色々やるので5000knps程度に落ちてしまってます。
0501496垢版2016/08/22(月) 21:10:28.52ID:WzxI/O2e
2000万ノード/sとかってsseやavx使って始めて可能になるレベル?
オセロの合法手の実装になにかすごい効率的なビット演算やってるとか?
0502460垢版2016/08/23(火) 11:44:32.28ID:sSUGbl7L
>>501
終盤探索だと合法手生成は葉ノードの近くでは使わないので、ループや条件分岐を使ったコードでなければアセンブラでなくても速度はそれなりに出ますよ。
こことかが参考になります。
http://d.hatena.ne.jp/ainame/touch/20100426/1272236395

自分はこんな感じのコードをアセンブラに落として少し改変したものを使ってますー
0503460垢版2016/08/23(火) 11:47:50.11ID:sSUGbl7L
置換表に超大バグがあることに気づき修正したらFFO45が32秒になりました…w
180万局の学習を朝に終えたので今晩再度FFOを測定しようと思います。
0504310垢版2016/08/23(火) 13:54:12.88ID:LVh7XLe+
>>502
そのサイトは知りませんでしたが、同じことやっています。
自分の場合は、それをAVX2命令で1,7,8,9ビットシフトを4つ並列で動かす様にして、
右シフト左シフト2回の演算をC++で組んでます。並べて書くと混乱しそうだったので
演算オーバーライドしまくりで、バグ防止しました。
やっぱりアセンブラの方が速いんでしょうね。


ディープラーニングな評価関数の方ですが、突然収束を始めました。
まだ途中ですが、見た感じざっくりで、平均二乗誤差の平方根(σ)が0.6石程度に
収まりそうです。2σで1石、スコアは2づつ変わるので、評価逆転が起きる確率を
数%程度にするには、0.5石以下にしたい。

肝はミニバッチのサイズだった様です(謎)。ハイパーパラメータとしては考慮対象外
でしたが、テスト用に小さくすると収束が悪くなる感触があったので、思い切って大き
くしてみたところ…大きくすればするほど記録を更新していくという状態。ついに212640
件という特大バッチサイズにしてしまいました。メモリー的にはまだいけるかも。

今までの比較検討データは全てパーになったので、検討済のネットワークも、バッチ
サイズ変えて再評価です。今やってるのは、Buroさんパターンがベースのネットワーク
ですが、もしかしたら入力ベタ打ちで「勝手に特徴抽出してくれる。すげー!」に戻るかも(汗
0506名前は開発中のものです。垢版2016/08/23(火) 21:26:59.10ID:KqeLXU8U
文系の俺には全然分からん。
もっと簡素な3目並べなら勝てるAIとか作れないかな(´;ω;`)
0507名前は開発中のものです。垢版2016/08/23(火) 21:47:29.66ID:1+aieVpn
ちょっと興味が湧いたんでとあるオセロアプリ落としてやってみた。
弱設定AIが程よく負けてくれて嬉しいw
一方的にボコされたら詰まらんよな一般人は。
オセロAIはもう神の領域だし。
0508460垢版2016/08/24(水) 01:02:17.32ID:elb1k4A2
色々チューニングしてトライしましたが、FFO57を大きく落としてしまい、放心中ですw
FFO57以外は全体的に高速化しているのですが、合計としてはあまり変わらない結果に・・・
終盤MPC探索中にa6とg7でかなりふらつくので、置換表に次善手も入れておかないとダメかもしれません。
とりあえずEdaxとゼブラのオーダリングあたりのソースを見直す予定です。

name    move    time[s]   node[Mn]
FFO#40  a2:+38   1.05     10.61
FFO#41  h4:+0    3.23     37.85
FFO#42  g2:+6    2.43     31.69
FFO#43  G3:-12   7.69     79.04
FFO#44  D2:-14   5.09     48.95
FFO#45  b2:+6    30.21    409.43
FFO#46  b3:-8    7.23     78.8
FFO#47  G2:+4    3.1     38.9
FFO#48  F6:+28   19.58    207.46
FFO#49  e1:+16   45.11    527.45
FFO#50  d8:+10   144.14    1330
FFO#51  E2:+6    39.91    502.74
FFO#52  a3:+0    52.56    687.22
FFO#53  d8:-2    617.63   8360
FFO#54  c7:-2    944.7    13410
FFO#55  G6:+0    測定中
FFO#56  H5:+2    262.85   3410
FFO#57  a6:-10   1523.67  19710
FFO#58  g1:+4     674.09   9760
FFO#59  g8:+64    1.08    5.57

合計4385.35[s](FFO55未測定) 合計ノード数:58645.71[Mn]
0509310垢版2016/08/24(水) 10:40:19.04ID:GpcelPIW
こちらも大バグを見つけて放心中です(汗

ミニバッチサイズごときで収束具合が大きく変わるのがおかしい点。
ミニバッチサイズを大きくすると、収束点がかなり規則的に減少していくように見える点。
この2点から、寝ながらデバッグしてたんですが、テストデータの件数で平均を出すべき
ところで、ミニバッチサイズで割っていた事に思い当りました。

で、修正して、行列の列数で割るようにしたのですが、今度は列数がリセットされていない
事が判明。どうもポインタ渡しで行列を渡した時に行数・列数が正しく引き継がれないよう
な現象のようです。

というわけで、一瞬大喜びしましたが、全くのやり直しとなりました。
0510460垢版2016/08/24(水) 14:56:52.40ID:Kkx6VEyM
>>509
学習プログラムのバグはやっかいですよね。
自分も何回ひどい目に遭ったか…
今でもまだありそうな気がして怖いですw
0511460垢版2016/08/24(水) 22:16:05.70ID:elb1k4A2
FFO57をどうにかしようとチューニングをして、なんとかFFO57が1200秒台に縮まりました。
ある程度縮まったので、期待せずにもう一度全部を測定してみると
全体がかなり高速化されていて、FFO55がまさかの3774秒までに縮まりました!(奇跡)
とりあえずこれをオーダリングの暫定最終結果として、次は並列化に手を出してみようと思います。
まずはYBWCアルゴリズムの実装方法の検討から・・・

FFO#40 (a2:+38) 1.05s FFO#41 (h4: +0) 3.19s
FFO#42 (G2: +6) 2.55s FFO#43 (G3:-12) 7.82s
FFO#44 (D2:-14) 4.18s FFO#45 (b2: +6) 29.77s
FFO#46 (b3: -8) 6.99s FFO#47 (G2: +4) 3.10s
FFO#48 (F6:+28) 19.49s FFO#49 (e1:+16) 36.63s
FFO#50 (d8:+10) 128.15s FFO#51 (E2: +6) 50.46s
FFO#52 (a3:+0) 36.88s FFO#53 (d8:-2) 427.77s
FFO#54 (c7:-2) 730.26s FFO#55 (G6:+0) 3774.07s
FFO#56 (H2:+0) 185.22s FFO#57 (a6:-10) 1281.31s
FFO#58 (g1:+4) 556.86s FFO#59 (g8:+64) 1.08s

合計:7286.83[s]
0512310垢版2016/08/25(木) 00:17:23.06ID:ZE8G6YuY
>>510
Eigen導入前のプログラムみたいにFFOの盤面渡して評価値見るようにしていれ
ば良かったのですが、あまりに収束しないので、収束の兆しが見えてからやろう
なんて放置していたのが失敗でした。あまりに急速に状況が改善していったので、
0.5石切るか知りたくなって、確認が後回しになってました。反省orz

ちなみに、列数がリセットされない問題も、原因がわかりました。
これも自分のミスというか、Eigenの使い方間違ってました。

Eigen便利すぎて、少なくとも行列演算部分に関してはバグフリーで、簡単に先に
進めちゃうので、細かいところがなおざりになっていたような感じです。
0513460垢版2016/08/25(木) 11:20:22.96ID:PNQVZmVa
そういえばFFOに夢中すぎて中盤の強さ評価を忘れていました。
現在は180万局の学習が終わっていますが、ゼブラ(24手読みBookなし中盤誤差なし)と黒と白で戦い、
それぞれ+8と-2という結果になりました。
完全にBook無しだと、白黒両方とも虎定石からのe3酉定石に分岐するため、
金魚や大量取りなどの主要な引き分けオープニングからの勝率を測定しようと思います。
あとHTML5版のMasterReversiレベル3とも対戦してみましたが、白黒両方とも-2という結果に…orz
Book構築方法もそのうち考えようと思います。
0514460垢版2016/08/27(土) 00:02:49.98ID:ct+QEGYU
学習プログラムのバグが怖くなって見直してたら超大バグを見つけました・・・
パターンモデルのうち、triangle(Thellが用いているモデル)だけが
局面出現数のカウントリセットされておらず延々と増え続けていましたw

あと同じ棋譜が結構あり、ダブった棋譜を全て除去すると180万局よりも10%程度減りそうです。
とりあえず除去中の150万局の棋譜でもう一度再学習します・・・orz
0515460垢版2016/08/27(土) 13:15:04.86ID:ct+QEGYU
学習プログラムのバグを直して再学習させたWZebraとの対局結果ですが、芳しくないです。。
棋譜生成で次善手を選ぶ時、打った後の7手読み(対局が8手読みなので)評価値で全ての手をソートしてから
2番目を選んでいるのですが、評価誤差を全く気にせずに選んでいました。
最善手が+10でも次善手が-4とかいう局面も結構あるので、そういった誤差が大きい手を選んでしまうと棋譜の質が低下します。
なので、最善手と次善手との誤差が-2以下の場合のみ次善手を打つようにしました。
その代わり85%で1回打つという処理を単に5%で打つように変えています。
これでなんとか中盤が強くなればいいですが・・・
0516460垢版2016/08/27(土) 13:18:13.50ID:ct+QEGYU
WZebra24手読みBOOK無し評価誤差なしとの対局結果

ゼブラは評価誤差がEdaxやMasterReversiに比べて大きいので、本来負けちゃいけないんですよね。。
実際50万棋譜計画のやつで学習させた場合はほとんど勝っていました。(負けても-8とかはありえない)

牛定石[f5f6d6]

黒持ち:+2
白持ち:+0

酉フック[f5d6c3d3c4f4c5b3c2e3]
黒持ち:+8
白持ち:-8

金魚[f5d6c3d3c4f4c5b3c2e6]

黒持ち:-2
白持ち:+4


FJT[f5d6c3d3c4f4c5b3c2e6]
黒持ち:-4
白持ち:+2

コンポス[f5d6c3d3c4f4f6]
黒持ち:-2
白持ち:-6
0518名前は開発中のものです。垢版2016/09/02(金) 09:47:35.76ID:+DjGOwAN
事前学習じゃなくて、強化学習な手法を試したら良いのではないかな。
何をどうすれば良いのか、俺はわからんけど。
0520名前は開発中のものです。垢版2016/09/03(土) 20:21:58.46ID:lICUKSF2
とりあえず自己対戦棋譜が1000局集まりそう。
まだ足りないかな?
ここからどう学習させればいいのか…
0521名前は開発中のものです。垢版2016/09/03(土) 21:00:16.00ID:DJdWXbUx
自分も機械学習とか興味あって細々作ってるけど、とても難しい
学習以外の部分も難しくて辛かったけど、学習はなかなか思い通りにするのに苦労する

とりあえずオンライン学習ってので、自分なりに色々やってみたけど
やっとちょっと上手くいき始めたかなってところ
ミスって学習やり直しとか何回もしてしまった
0523460垢版2016/09/04(日) 01:59:20.91ID:f4dqEnZp
>>520
オセロは今でこそ強いソフト同士の棋譜が手に入りますが、
初期は人が対局した棋譜(ISOなど)を残り十数手のみ修正して学習させていたようです。

マイナーゲームが何かによりますが、オセロみたく終盤で神のような読み切りが出来る場合は
自己対局の教師あり学習で適当なモデルでもかなり強くすることはできるかと思います。
0524460垢版2016/09/04(日) 02:00:39.37ID:f4dqEnZp
レス番号間違えました。。>>523>>517宛てです。。
0525460垢版2016/09/04(日) 02:14:06.21ID:f4dqEnZp
自己対局中は暇なので、GUIの拡大縮小対応に手を出してみようと思ってドツボにはまりました。。
C#って描画ほんと遅いですね。。フルスクリーンにするとリスケールも含めて150msecぐらいかかります。
1024x768くらいだと50msecなのでギリギリ許容範囲内かなぁ。

あとGUIの実装に合わせて定石の変化度をツールバーから選べるよう実装していたのですが、
変化度を上げると着手時になぜか頻繁に落ちることが判明。
調べると、定石の木構造を作る処理に壮大なバグがあり、
30万近くある定石のうち1万くらいしか読み込めておらず、
リストも頻繁に上書きされてめちゃめちゃ状態でした。バグというか実装になっていないレベル。。
変化度を弄った時の処理をほとんどテストしなかった数年前の自分を殴りたい。。
かなり昔のコードなので、もう修正をあきらめて再設計して一新しているところです。
0526310垢版2016/09/04(日) 17:00:43.77ID:WEaBeSKk
実際、開発中ってアドレナリン出てるから、ほとんどノーテストで行けるところまで
行っちゃって後で何やってるの俺?って事がしばしば(汗

というかここ数日も、非常につまらない確認漏れというか、毎回間違うswitch文でバグ
出しているのに気づかずに、これはメモリーリークか?それとも計算式が間違ったのか?
みたいな状態になっていました・・・。

さて、今いじってるディープラーニングの仕組みは、かなり汎用性持たせて作ってます。
あまりに収束具合が悪いので、試しに、Buroさんモデルにしてみました。1層の活性化
関数無しにして、入力プログラムを流用するだけなので簡単です。でも、なかなか収束
しない。そこで、過去にどこまで収束したのか、残ってるログを探したところ・・・実際、
同じような感じ(1σ=約3.5石)でした・・・つまり、なんかできてると言えばできているし
これで満足かといえば満足ではなしと。また、なまじデバッグでまじまじ評価値を見ちゃっ
たため、これで本当に使えてるのか?状態です。

で、ミイラ取りがミイラになって、ディープラーニングの学習係数の最適化手法とか、
学習効率向上の方法を色々実装してました。勾配ノイズなる手法も入れてみました。
一体自分はどこに向かっているのだろうって状態です。
0527460垢版2016/09/05(月) 19:53:28.81ID:5Av5ahUz
そういえば散々オセロソフトを開発しておきながらネット対戦のオセロを一回もやった事ないなと思い・・・
やってみると案外勝ててしまいました。
この形は有利不利とかイメージだけで打っていましたが、、人間のパターン認識も結構優秀ってことですかねw
0528460垢版2016/09/05(月) 20:11:21.05ID:5Av5ahUz
>>526
ディープランニングはやはりなかなか曲者のようですな。
こちらも終盤の評価値が悪いところはよく見えて良いところは悪く見えるという平均化が起こっていてやばいです・・・
まずは次善手の割合を調整したのでどうなることやら。。
というかもうランダム数手をやめて、引き分けオープニングからの棋譜生成を重点的にやった方がいいのか考え中です。
0530310垢版2016/09/05(月) 22:33:11.28ID:KkVISbKe
上に書いた通り、線形回帰はディープラーニングに内包される計算手法ですので
(実際に最急降下法とバックプロパゲーション部分以外の計算式はほぼ同じ)、
学習率の設定にディープラーニングの最新の手法が使えるんじゃないかと思います。

学習率を外から与えるのではなく、初期値だけ与えて、後は誤差の具合を管理して
動的に変える。しかも、各重み毎に個別に学習率を変える。という発想です。

参考)
http://postd.cc/optimizing-gradient-descent/#gradientdescentoptimizationalgorithms
http://qiita.com/skitaoka/items/e6afbe238cd69c899b2a
※)数式で、ただの変数のように書いてますが、行列だったりベクトルだったり解読が必要です

自分はこの中で一番新しいSMORMS3を使用してみたところ、モーメンタム法の10倍
以上の速さ(学習回数)で収束するようになったと感覚的に感じています。大体30〜
50回も回せば収束してしまう感じです。実装&テストだけして確認していませんが、
AdamやRMSpropでもそん色ない程度には速くなると思います。

でも、早いPCで解決できるんなら、それに越した事はありませんねorz
0532310垢版2016/09/05(月) 22:41:44.52ID:KkVISbKe
いかなディープラーニングでも評価関数をいきなり作るのは厳しい気がしてきてます。

ここはアルファ碁の学習の仕方にならって、最初は次の1手を学習させてみようかと。
で、今までは頭でわかったつもりになっていた、多クラス分類問題を調べてみると、
Softmax関数の微分(バックプロパゲーションで必要)がわからない事にあらためて
気が付きました。

幸い、Softmax関数の定義があるひな形プログラムがあったので、これから解読です。

人さまのプログラムを見ると、自分がいかにC++を知らないのか、思い知らされますorz
0533460垢版2016/09/07(水) 01:48:41.72ID:UfwPrMcb
自己対局ですが、8手読みの20マス空き完全読み設定だと、2日で大体20万局終わることが分かりました。
ここまで速いと10手読みの22マス空き読みにランクアップしてみたいところ。。
体感だと1/3くらい遅くなっているのですが、22マス空き読みだと偏りもひどくて、
1〜2日やってみないとなんとも言えない感じです。
2日で7万局程度終えられるなら、それでのんびりやろうかと思います。
0534460垢版2016/09/07(水) 03:02:28.63ID:UfwPrMcb
今しがた動かし中ですが、400局完了まで16〜17分でした。
1時間で1400局程度できそうなので、1か月で100万局くらい行けそうです。
とりあえずこのまま100万局集めようと思いますw

あと、初手ラムダムをやめて最悪手が数%程度で打つよう、評価値によって着手確率を調整しました。
最悪手の絶対値の1.2倍をそれぞれの評価値に加算した後の総和を使って
それぞれ加算した評価値を除算という古典的な方法ですが・・・
この方法だと絶対値が0に近いと悲惨な事が起こるので、絶対値は>=4にしています。
0536460垢版2016/09/07(水) 23:57:41.97ID:UfwPrMcb
>>535
とりあえずmm.exe < input.datでコンソールに何が出てきてるか見た方が良いかも。
Cygwinでやるとこんなの出てきました。

$ ./mm < input.dat
..
Games = 2
Feature1 -0.89588 2.44949 0.0285792
Feature2 -0.867301 2.38048 0.15838
Feature2 -0.708921 2.0318 0.0737065
Feature2 -0.635214 1.88743 0.0358307
Feature2 -0.599384 1.821 0.0187057
・・・(略)・・・
0 1.49416
1 1.21426
2 0.586193
3 0.668003
4 2.13451

outputは下5行だけが出力されるみたいです。
0537535垢版2016/09/08(木) 00:10:42.63ID:/oQCQhP8
>>536
おお、返信ありがとうございます。
mm.exe < input.datやってみましたが何も出ないです。
もしかしてinput.datはなにか編集しないといけないのでしょうか?
0538535垢版2016/09/08(木) 00:16:47.92ID:/oQCQhP8
すいません。
makefileからコンパイルオプションを取り除いたところ結果が出力されました。
-O3がダメなのかなぁ。

ともかく、ありがとうございました。
0539460垢版2016/09/08(木) 00:21:28.75ID:LcwQkLYi
>>537
input.datは全く編集せずにやりました。
Cygwin64bitだと動くのですが、環境によっては動かないんですかね・・・
gcc-5.4.0でビルドしましたが、コンパイラのバージョンの差異も原因かもです。
0540460垢版2016/09/08(木) 00:23:56.75ID:LcwQkLYi
>>538
動いてよかったです。
最適化が悪さしていましたか。。-O1程度の方がいいかもですね。
0541460垢版2016/09/10(土) 21:06:28.42ID:FA2ccDEd
>>534の読みを深くさせた自己対局棋譜ですが、15万程度集まったので
無理やり学習してWZebraと対局させてみたところ、黒持ちで+12、白持ちで+2でした!
次善手や序盤ランダムの考慮と読みを深くした効果が現れてて安心しました。。100万達成した時の結果が楽しみです。
0542460垢版2016/09/11(日) 09:03:13.98ID:UepiTkRD
ついにBOOKの読み込みとアルファベータによる手の選択を実装できました。
まだ最善しか着手できないので、誤差率によるランダム着手も実装しようと思います。
ゼブラのExtra-Bookをそのまま使っているので、ゆくゆくは自力で構築できるシステムを
考えたいところ。。
0544460垢版2016/09/11(日) 15:25:12.97ID:UepiTkRD
>>543
いえ、さすがにそこまでは・・・w
Edaxの作者が完全解析を先行してやってるみたいですし、そこは任せようかなと。
最終的にEdaxやMasterReversiと同等の評価関数やBOOKを作成できるレベルまで持っていきたいです。
0545535垢版2016/09/12(月) 21:36:16.05ID:vkOlNla9
>>535です。
<number of gammas for this feature>というのがよくわからん。
とりあえず1にしとけばOKみたいな?
input.dat色々いじってみたけど確かにそれっぽい値はに出る。
0546310垢版2016/09/12(月) 22:52:49.52ID:5hD0Gf9W
>>460さん、着実に進んでいてうらやましい。

自分はというと、だんだんとオセロの事は忘れて、ディープラーニングのプログラムの
確認修正、機能追加に頭がスイッチしちゃってる感じです。むむむ。

C++スキルも微妙に上がってきていますので、オセロ側に戻る時も、もう1回1から
全部コーディングしなおした方が良いかもw。ほとんどCの状態から始まって、もう3回
くらい書き直しているので、そんなに時間かからないと思うし。

と、どんどん脱線していくのであった。

>>545さん
そのプログラム見てないですが、γというと、たいてい何かの係数パラメータじゃないかと。
0547535垢版2016/09/12(月) 22:58:52.81ID:vkOlNla9
>>546
返信ありがとうございます。
係数ですか。詳しい説明がどこにあるのかわからなくて。。。

プログラムって最初から書き直すほど洗練されていきますよねw
0548535垢版2016/09/14(水) 22:57:07.95ID:lQtAf6dT
本番のデータ使うと結果が表示されないorz
入力ファイルの形式なんか間違ってるんだろうけど
何間違ってるのかわからんorz
0549535垢版2016/09/15(木) 21:47:58.41ID:NUOEmvbB
もしかして万が一だけど同じフィーチャーに属するガンマは同じチームになれないとかあるのか?
0550535垢版2016/09/15(木) 23:35:36.05ID:NUOEmvbB
うお〜わかんねぇぇぇ
コード熟読しかないのか?
厳しいぃぃぃ
0551310垢版2016/09/16(金) 00:03:09.94ID:44uFy3HE
featureってコンピュータの世界では、機能を意味するよね。
あと、もう一度読み返すと、γが複数形になってるので、
γの数であってγの値ではなさそう。

「この機能で使用するγの数」となるけど・・・
これだけだと正直なんのこっちゃだねw

この機能が何を表すかどこかに書いてないの?
0552名前は開発中のものです。垢版2016/09/16(金) 07:31:01.43ID:mrye4Vvn
もう一年くらい将棋をちまちま作ってるけど、なかなか強くならないな
最近ようやくアマ高段くらいには行った感じだ
ランダムでただ指すところから始めて、先人の歴史を全部なぞるようにプログラムして来た

みんなはゲームは違うだろうけど、もうその筋ではかなり強いレベルなの?
0553460垢版2016/09/16(金) 13:50:57.59ID:gJ0b6G2+
自己対局での棋譜生成ですが、10手読みだとまだまだ精度が落ちるようで、思いきって中盤16手読みの24手読みにしてみたところ…10分で35局…w
今日は出勤時間がせまっていたのもありこのままで生成していますが、
中盤14手読みか12手読み、22マス空き完全読みにした方が良さそうです。

ああ、PC10台くらい並べて棋譜生成したい…
0554535垢版2016/09/16(金) 21:02:11.49ID:l6ih+FVI
>>551
返信ありがとうございます。

どこかに解説あるんですかね?
ちょっと本気で探してみるか…
0556535垢版2016/09/16(金) 22:26:17.01ID:l6ih+FVI
囲碁の手の特徴にパス、トリ、伸び、自己当たり、当たり、
盤端との距離、直前の手との距離、2手前の手との距離、モンテカルロオーナー
などがあると書かれている。

feature=特徴?
0557名前は開発中のものです。垢版2016/09/17(土) 22:31:21.85ID:mQ7ypIPZ
下がりすぎ
上げるぜ
0558460垢版2016/09/18(日) 02:39:21.57ID:6855FAgd
オセロオンラインというアプリに付属されている真・HAYABUSAと対戦してみました。
どうも定石がかなり充実しているようで、普通にやってると
こちら側が記憶していないドロー進行に分岐されて負けます。。
しょうがないので野兎とか序盤から不利な定石に分岐して評価関数の勝負に入らせると、案外勝てましたw
評価チューニングがEdaxなどに比べると結構甘いようです。
とはいえ国産アプリでここまでチューニングされているとは思わなかったので驚いています。
0559名前は開発中のものです。垢版2016/09/18(日) 09:21:43.32ID:u+E0nELs
おめでとうございます

ひょっとして物足りないと感じましたか?
それなら次は
PREMIUM・HAYABUSA に挑戦してみませんか?
いまなら特別キャンペーン中につき(ry
0560535垢版2016/09/21(水) 00:02:39.39ID:DjDR9tnr
すいませんが誰か俺のデータを>>535のmm.exeにかけてみてくれませんか?
まじで何が悪いのかさっぱりわからん。
環境の問題かも?

http://thuploader.orz.hm/uploader/
のmy_input.zipが俺のデータです。

だれか親切な方よろしくお願いします。
0561310垢版2016/09/21(水) 01:01:30.09ID:CFP8O8Vn
>>558
http://www.slideshare.net/uenokazu/20130906-hayabusa

これですね。色々AIの特徴を説明してますが、まあLogistelloの
日本語解説みたいな感じで、皆さんのAIもほぼ同じ構造かなと
思います。

テレビ番組企画でEdaxと良い勝負するAIを短期間で開発したという
のが開発経緯らしいので、恐らくEdaxをたたき台にして定石DBの
学習をしていると思います。

つまり、Edaxよりちょこっとだけ強ければよいと割り切った目標をたて、
目標がはっきりしている分、手間をかける箇所を、定石DBの対局学習に
集中したって感じだと思います。想像ですが。

で、これ読んだ時に、オセロAIの強さって結局は定石DBじゃんと、
結構真剣に思いまして・・・。まあ、それゆえ、オセロAIの開発者の多くが
ドロー進行のリストアップに走ってしまったのかなぁと。
0562535垢版2016/09/21(水) 20:18:28.81ID:DjDR9tnr
環境が悪いのかと思い押し入れからノートPCを引っ張り出して走らせてみたところ
計算結果がNaNになってるっぽい。
駄目なのか?うーむ。
0563460垢版2016/09/22(木) 13:08:07.84ID:aLXK2a2e
>>561
ほとんど考えずに打ってくるので、もしやと思い定石からわざと外してみたらいきなり10秒超の長考でした・・・w
本当にBOOKの精度がEdaxよりちょっと良いのでしょうね(逆に言うとそれだけ)
開発期間が短期間って制限があったらしいので、しょうがないのでしょうけどもったいない気もします。
0564310垢版2016/09/22(木) 20:43:51.38ID:esximYO0
BOOK学習ってあんまり実装例見ないので、その点は評価しても良いかなと。
Buroさんの論文はあるので、自分もいずれは実装しようと思っています。

が、BOOK学習で、別のオセロプログラムとひたすら対局学習させると、そのプログラム
相手限定ならほぼ負けないBOOKが得られるんです。

EdaxのBookは引き分け進行のリストアップで、そこに記載されていない分岐は、基本は
分岐した方が負けるはずなのですが、分岐後は純粋に評価関数の読みの勝負になるの
で、いかなEdaxでも間違える事があります。で、勝った手順、負けた手順をリストアップし
ていき、負けたら勝つ手順が見つかるまで、ランダムな手番で別の分岐を探していく。

Edax側がBOOK学習をオフにすれば、間違えた箇所は何度対局しても同じ間違いをする
ので、勝った手順になれば勝ちは確定し、負け手順は自分は打たないようになっていく。
要するに、そのプログラムの弱点を学習する事になるので、勝率が上がっていく。

EdaxのBookより精度が良いというのとはちょっと違う気がします。

とはいえ、Edaxとかの引分進行リストをパクっても意味が無いし、限られた時間で、パソコン
ぶん回して引分進行を発見していっても、間に合わないしで、これしかやりようがないんだ
とは思います。

実はこれに気が付いた時、BOOK学習+乱数着手(打たない箇所がない)で、自己対局を
延々と続けていくと、究極のBOOKができるんじゃないかと妄想してしまいましたが、よくよく
考えたら、それって全手順リストアップというか、完全解析大差ない事に気が付きました(汗
0565535垢版2016/09/22(木) 21:29:54.82ID:kzrJOomn
RemiさんのMM法諦めるしかないのかなぁ
他の学習方法探すか…
0566535垢版2016/09/27(火) 23:07:26.38ID:AU3JIk+S
いまいち手ごろな強化学習が見つからなかったので
モンテカルロ木探索をパターンに応用することにした。
0567535垢版2016/09/28(水) 22:21:31.56ID:DgDU0GF3
とりあえずConnect 4のAI書いてるんだけどまあまあ強くなってきた。
Connect 4は完全ソルバが公開されてるので
先手でこれに一発入れるのが当面の目標。

Connect 4 完全ソルバ
http://connect4.gamesolver.org/?pos=
0568535垢版2016/09/29(木) 20:34:59.17ID:1GHOMTNV
評価関数の基になるパターンが悪いせいで
一生学習しても完全ソルバに勝てない気がしてきました。
0569535垢版2016/09/29(木) 21:12:02.15ID:1GHOMTNV
まあ、Connect 4は習作なので一定の成果が確認できたということで一旦休止します。
これから本番のゲームに着手します。

できたConnect 4のexeをアップしてみます。
http://fast-uploader.com/file/7030706137212/

Connect 4の経験がない人にはかなり強く感じるはずです。
遊んでみてください。
0570535垢版2016/09/30(金) 22:44:03.81ID:Ol1OvzoR
人為的なパターンを評価関数の基礎においてると
幾ら学習しても完全解析にたどり着かない可能性があるよね?

十分学習すれば完全解析にたどり着くと保証できる
出来るだけ効率の良いパターンセットてのは
なんとか数学的に割り出せないだろうか。
0571460垢版2016/10/01(土) 15:19:39.34ID:NwASWJgd
>>570
オセロしか開発したことがないのですが、connect4のノード数だと4兆程度だと聞きました。
オセロよりも合法手生成が簡単かつ常に7つなので、相当早い段階から完全読み出来そうです。
現在のAI同士を戦わせて数千から1万局程度の棋譜を作成すれば、
簡単なモデル(縦横斜めだけとか)でほぼ完ぺきな評価関数が線形回帰で
出来そうな気がするのですが、どうでしょうか。
0572535垢版2016/10/01(土) 16:21:13.92ID:UW3pMcrq
レスありがとうございます。

線形回帰は試したことないですが縦横斜めのモデルで
勝率で重みを振って評価関数を作ったのが>>569です。

線形回帰で学習させれば>>569はもっと強くなるんですかね。

縦横斜めモデルは意外とイケてないんじゃないかというのが今の私の感触です。

あと初手から10手目位まではBOOK作ったほうが良いのかなぁとも思ったり。

終盤完全読みは今やってないですが、やってみる価値ありそうな気がします。
0573535垢版2016/10/01(土) 22:20:23.15ID:UW3pMcrq
ちょっと思いついたんで、縦横斜めのパターンに加えて、
盤面の空マスの情報をパターンに加えて再学習させてみます。

もしかしてこれなら完全ソルバに一発入るかも?
0574460垢版2016/10/02(日) 00:33:37.72ID:jNeryq9p
>>572
完全読みは深くすればするほど線形回帰で有利になってくるのでオススメです。
オセロでも20手読みの棋譜と22手読みの棋譜では2手違いなのに強さが段違いでしたので・・・
0575535垢版2016/10/02(日) 00:38:22.45ID:8lzQrfNi
レスありがとうございます。

オセロでも20手も読めるのか!
Connect 4ならもっと読めないとダメですね〜

線形回帰はちょっと調べてみます。
0577460垢版2016/10/02(日) 04:03:56.40ID:jNeryq9p
>>576
オーダリングはしてますか?オーダリング無しだと20手は厳しいと思います。
オセロは最後あたりだと数マスしか無くなるので合法手が1手しかないとかも頻出するのですが
connect4は最後まで7つあるので、20手はちょっと難しいかもですね。。
0578名前は開発中のものです。垢版2016/10/02(日) 18:53:33.45ID:8lzQrfNi
すいません。
オーダリングとはよさそうな枝を先に読むってことでしたっけ?
なぜそれで計算量が削減できるんでしたっけ?
最終的に全部読むなら結局同じのような…
素人考えですが。
0579名前は開発中のものです。垢版2016/10/02(日) 19:09:19.16ID:8lzQrfNi
完全ソルバと対戦させると誤った学習をしてしまってるように見えます。
悪い手を良い手と思ってる。
うーん。
学習量が足りないだけなんだろうか?
0580310垢版2016/10/02(日) 20:32:53.90ID:n86BxDyi
>>578
αβ刈りしているでしょ。

最初に読んだ手でα値が最高値になる。
次の手を1段読んだ時、それを超える手が出ないので、全ての手がβカットの対象となる。

本当に一番良い手を選べるんなら、そもそも読む必要がないけど、何らかのヒューリスティック
な基準でよさそうな手から読むと、それが正解だった時に、βカットが大量発生して、実際に
読む事になるノード数が激減する。

αβ刈りみたいな方法は、後ろ向き枝刈と言って、完全読み切りに必要が無い手を読まずに
済ます手法。
0581名前は開発中のものです。垢版2016/10/02(日) 20:59:00.22ID:8lzQrfNi
レスありがとうございます。

αβですか〜。
実はあれ、私、理解してないんですよね。
説明読むとなんとなくわかった気になるんですけど
いまだ実装できたことない。orz
MinMaxなら実装できるんですけどね。
0582名前は開発中のものです。垢版2016/10/02(日) 21:29:32.92ID:8lzQrfNi
αβが最高に上手く働けばMinMaxの倍の深さ読めるんでしたっけ?
それなら20手行けそうですね。
0583535垢版2016/10/03(月) 00:03:31.42ID:5qtC3pHr
完全ソルバでいろいろ試してるんですが、
Connect 4って思ったよりずっと底の浅いゲームのような気がしてきましたw

□□□□□□□
□□□○□□□
□○□●□○□
□●□○□●□
□○□●□○□
□●□○□●□

この配石が必勝法の骨格のようです。
ここさえ押さえればあとは自動的に勝つる。
0584310垢版2016/10/03(月) 01:55:16.80ID:alBluDZI
>>582
深さはなんとも言えないけど、オセロで言えば、αβだけでノード数は1/100くらいに
なるってどこかのサイトに出ていたかな。1/100だとアバウト2〜4手くらい深く読めるはず。

置ける箇所が結構絞られるゲームなので置換表入れたら更にいけるかもしれない。
あとはビットマップの実装だね。

ゲームの規模的には(ネットチラ見だけど7兆パターンって書いてあった)完全解析を
ターゲットにしても良い気がする。軽はずみ発言だけど。
0585310垢版2016/10/03(月) 02:02:27.60ID:alBluDZI
ちなみに。当方、Sparse正則化付AutoEncoderの実装に不安が付きまとった挙句、
MNISTという手書き数字認識のテストで動作確認をするという遠回りな事をしてます。
というか、何をしたら認識率改善するのかという事を考えて、色々といじって時間を
食ってました。

結果、オセロの方が盤面は狭いけど、良く現れる状態の数と、その特徴の複雑性が
圧倒的に違うので、やはり畳み込みのような、盤面の特徴の解釈の仕方を外から
与える方向に行く必要がありそうだという事になりました。
いままでも薄々気づいていたんですが。

ただ、画像解析や囲碁のように隣接するノードとの関係性からスタートしても意味がなさ
そうなので、その辺の工夫をしてみようと思っています。
0586535垢版2016/10/03(月) 22:00:29.42ID:5qtC3pHr
完全解析はできるに越したことはないですが、
Connect 4やってるのは勉強の意味あいが強いので
Connect 4以外では通用しないようなヒューリスティックで強くなるのは
出来るだけ避けたいです。
理想的には汎用的な手法で完全解析レベルまでもっていきたいですね。

αβもそろそろ片づけなければいけない宿題ですね。
0587460垢版2016/10/04(火) 00:53:57.08ID:OTRn7xTU
コネクト4、軽く実装してみましたが(ほとんどオセロの流用)
単純アルファベータ、置換無しオーダリング無し、
評価関数が連続している数だけ考慮・・・だと8手涛ヌみは一瞬ですbェ、12手読みはbキでにきついでbキね。。
末セ日評価関数を給lめてみてとりbえず8手読みで535さんのAIと対戦してみる予定ですw
0588535垢版2016/10/04(火) 21:18:36.22ID:dRd+Ucp+
おお!楽しみですね。
ありがとうございます。

工夫無しの8手読みなら勝ちたいですねw

ちなみに私のAIは結構思考時間が長いのでw
統計といえるほどの試合数はこなせないと思いますが期待しちゃいます。
よろしくお願いします。
0589460垢版2016/10/05(水) 00:36:10.60ID:JvSO0BT6
>>588
結果ですが、ぼこぼこにされましたw
ヒューリスティックだとやはり限界ありますね〜
0590460垢版2016/10/05(水) 11:21:34.44ID:WWXbBFqc
オセロは大体やることはやったので、そろそろ将棋か囲碁に着手してみようかと思っています。
ルールの実装が楽なのは囲碁なのかな…
自身が囲碁を打ったことがないのでルールから調べないとですがw
0591310垢版2016/10/05(水) 12:08:04.26ID:Iif/OHnc
やっぱ囲碁行きたいですよね。

昔調べた感じでは、日本ルールと中国ルールで勝敗の判定が微妙に違って、日本
ルールだと曖昧なところがあるので、AI開発は中国ルールでしているみたいです。

ルールの実装は着手禁止点が少なくて拍子抜けするくらいですが、その先が・・・
色々と一筋縄ではいかないようです。

オセロの評価関数ですが、AutoEncoderの限界を感じ、DCNNの実装を始めていますが、
バックプロパゲーションがスパゲッティでわけわからん状態になっています。しばらくは
紙と鉛筆で考える必要がありそうです。DCNNがある程度できたら、僕も囲碁に行って
みようかな。

その前にConnect4に脱線してみたい気も(汗
0592535垢版2016/10/05(水) 19:29:25.92ID:KcSrUkxH
>>589 >>590
ん。IDが違いますね。
>>589は偽物ですかね?
0593535垢版2016/10/05(水) 19:48:59.89ID:KcSrUkxH
>>591
囲碁は終局判定させるのも結構難しいみたいですね。
セキの判定とか。

Connect 4は易しすぎず難しすぎずいい塩梅のゲームだと思います。
完全解析も狙えますしw
0594460垢版2016/10/05(水) 21:34:13.58ID:JvSO0BT6
>>592
同一ですよ!
スマホから書き込んだのでID変わってしまいました
0595535垢版2016/10/05(水) 21:53:19.85ID:KcSrUkxH
ん〜そっちのID使って同一って言われても。
>>590のIDで書き込みお願いします。
0597名前は開発中のものです。垢版2016/10/05(水) 22:31:22.88ID:KcSrUkxH
>>590の書き込み時間からすると学校や職場から書き込んだ可能性もありますね。
とすると>>590のIDでは今は書きこめないかもしれませんね。
0598460垢版2016/10/06(木) 20:28:59.44ID:1mBat3Ee
460の名前があるものは偽物ではないので大丈夫です・・・
コテ付けた方がいいかもですけど、まぁこの人数ですし、そこまでする必要もないかなと思いますー

囲碁ですが、ネットから集めた棋譜をざっと見てみましたが、投了がほとんどなんですね・・・
中押し勝ち?はて・・・?となって調べるくらいルールを理解していないという;;
投了だとするとロジスティック回帰でないとあんまり良い精度は出なさそう・・・?
というより一般的な機械学習のアプローチで良いのかも微妙ですね。
やはりディープランニングなのでしょうか。。。腰が引けますw
0599535垢版2016/10/06(木) 21:04:20.88ID:/7+JrWaw
>>598
ん〜そうですか。
それは失礼しました。
0600310垢版2016/10/06(木) 22:11:43.15ID:2nbHwrUk
>>598
投了は将棋用語で「参った」です。むしろ中押し勝ちと同じ意味です(汗
将棋の場合、詰まれるまで粘る事はみっともないこととされているので、
入玉とか千日手、反則負けなどの特殊なケースを除けば全て投了です。

囲碁は、逆に終局まで打つ事があって、「数え碁」と呼ぶみたいです。
この間のアルファ碁vsセドルの試合見て覚えました(笑)
オセロのように必ず最後まで打って、得点差がはっきりと出るゲームの
方が珍しいのかも知れません。

オセロみたいなmin-Max+評価関数は既にダメ認定されてます。
アルファ碁までは、MTCS(モンテカルロツリーサーチ)が主流で、
モンテカルロ系には評価関数はありません。着手順決定のための
ヒューリスティックが大事になります。

アルファ碁の登場で、一気にディープラーニングにシフトしていますが、
基本骨格はMTCSです。着手順のヒューリスティックに「次の1手を返す
DCNN」と、評価値たるモンテカルロの勝率に、補助的に「勝率を返す
評価関数としてのDCNN」を組み合わせているようです。
0601310垢版2016/10/08(土) 22:22:06.53ID:wBSLMo4h
あ、MTCSじゃねー。MCTSだ。

>>600書きながら、Q-Learningなるものの存在を思い出して、調べ始めたら、
やっぱりDQN(ブロック崩しで有名になった奴)はQ-Learning+DeepLearning
だった。

興味津々だけど、どんどん発散しちゃうなぁ。
0602535垢版2016/10/10(月) 19:51:24.57ID:WonRpXhk
なんかモチベーションあがらんなぁ
三連休まるまるさぼってしまった。
0606310垢版2016/10/13(木) 11:06:43.08ID:f6Nd8WJL
ここ数日、気分転換でConnect4やってました。

ビットマップ方式の置換表付αβのオーダリング無し。リーチ状態のみ後方枝刈。
完全解析ができそうか確認してました。

全42手でルートから30手くらい置換表適用すると、序盤はかなり良いペースで探索
してくれますが、数時間で置換表パンク。置換表を20手くらいまでにとどめると、びっくり
するほど速度低下。手順の前後で簡単に同形が生じるので、置換表が肝なのは確か。
というか、手順前後の同形を排除する仕組みが作れればメモリ節約可能になる。
けど、それを一般化した処理が置換表なので、全てカバーしなくても3手以内くらいで
排除すれば状況はかなり改善するかも知れない。

あと、パンク前も探索が進むにつれて徐々にnpsが低下していきます。原因不明。
書きながら気づいたのですが、置換表のハッシュ値はオセロのものを流用しています。
Connect4はビット数が少ないので、ハッシュ衝突が頻発して、格納効率が低下して
領域拡張が頻繁におきて、探索速度も落ちている可能性があります。

というわけで、現段階では置換表周りを工夫しないと完全解析は厳しそうです。
一方で、空26箇所くらいの終盤探索なら実用的な速度が出そうな感触です。

>>569の完全ソルバは、評価値表示機能があるけど、あの表示の仕方だと、証明数
探索みたいな手法を使っているのかなぁ。ほぼノータイムで最善手のみ着手してくる
ので。完全ソルバの出現で終わっちゃってるゲームなんでしょうね。

で、このゲームってMCTSの練習台にちょうど良いのではないか?とふと思いついて
しまいまして・・・。更に脱線しようかなと思います。Playout関数は作りましたが、ツリー
展開の仕方に疑問があり、まだ調べ中です。
0608535垢版2016/10/13(木) 21:53:14.86ID:XMNeJMFS
名前書き忘れた。

終盤26手読み行けそうというのは流石ですな。
完全解析ってConnect 4だと簡単そうに見えますがこれが意外と手強いんですよね〜
0609310垢版2016/10/15(土) 13:58:53.52ID:iZ3eY/zy
NPS低下問題はやはりハッシュ衝突のようで、ちょこっと直したら解消しました。

Connect4は手順前後しても同じ形になる事が多いゲーム(DAG問題多発)なので、
置換表を上手く使わないと、7兆種類あると言われている盤面を何度も重複探索して
しまう事になります。が、置換表探索と登録のオーバーヘッドは結構大きく、メモリ
パンクでスワップ多発の問題も起きます。

今の設定だと残り27手探索くらいなら難しい問題で1分程度で解けそうです。
NPSは20メガくらい。が、メモリパンクや重複探索の問題があるので、その速度を
もとに完全解析に要する期間を推計するのは無理っぽい感じです。

というわけで、完全解析はこの辺にして、MCTSの方に行きます。
0610535垢版2016/10/15(土) 20:55:10.85ID:jn3cHMWR
>>609
多分純粋なMCTSだけではあまり強くならず、
プレイアウトになにがしかの工夫を入れる必要が出てくると見てます。

逆にプレイアウトさえ改良できればMCTSはびっくりするくらい強くなる。

しかしそれでも完全ソルバには届かない。みたいな感じだと思います。
0611310垢版2016/10/15(土) 21:29:59.48ID:iZ3eY/zy
MCTS(UCT)多分できました。STL様様です。
探索時間1秒で40万プレイアウト。

playout部をnegamax的に書いたので、ちょっと混乱しました。
まだ終局判定とかいい加減で、引分近辺で落ちる可能性あります。

オセロでも1秒で10万プレイアウト以上いけるんじゃないかなぁ。
探索時間固定できるのでオセロ序盤〜中盤で使えるかも。

>>535さんのプログラムはもうダウンロードできないですね。
0612535垢版2016/10/15(土) 21:54:42.38ID:jn3cHMWR
秒速40万プレイアウト!?すげぇぇぇぇ
1プレイアウト=1手てことですか?
1プレイアウト=1局てことですか?
0613535垢版2016/10/15(土) 22:17:47.78ID:jn3cHMWR
460氏もオセロで10000Knps〜15000Knpsとか言ってるし、まじか〜
やっぱ本気でやってる人達は違うのかな…
0614535垢版2016/10/15(土) 23:46:45.43ID:jn3cHMWR
NPSは20メガって書いてありますね…
すいません。
0615310垢版2016/10/16(日) 01:32:06.03ID:KTdXBWLt
プレイアウトなので1局です。色々ごにょごにょはありますが、ランダム着手で、
とりあえず勝負がつくまで打ちます。これで1プレイアウト。
速度が出るのはビットマップとBMI命令などのX64命令を使ってるからだと思います。

が、Perfect Solverに先手で勝てません(汗。5手目に必ず間違えます。
評価値を眺めても、当たり前のように、正解(真ん中列)が最下位になります。
パラメータをそこそこいじってみましたが、状況は変わらないです。
一本道には弱いって事かなぁ。

とはいえ、自分がやると、さっくりと負けてしまいます(汗
0616310垢版2016/10/16(日) 13:25:18.14ID:KTdXBWLt
mobility周りにバグがあって直したところ、1秒読みでPerfect Solverに先手で勝ちました。
昨夜は120秒読みでも同じ手順で負けていました。
とはいえ、乱数が絡むので引き分ける事もあります。

まだ若干問題があります。1本道を交互に着手していくと自動的に勝ちが確定する盤面
なのに、評価が引き分けになっています。プレイアウトの終局判定で何かの条件が抜け
ていて、勝ちと判定されていない感じです。

直したらまた勝てなくなったりして(汗

C++の診断ツールを今回初めて使ってみました。
関数ごとの使用時間がわかるようで、速度アップの検討に重宝します。
が、どうもUCB1の計算で使うsqrtとlogを使ってる箇所でCPUを9割くらい使っている
感じです。見方が良くわからないけど、多分そういう状況。速度アップ難しい。
0617535垢版2016/10/16(日) 16:43:19.50ID:Ts0NTtMt
一秒読みで完全ソルバに勝とかまじか〜
やっぱ積み上げてきた基礎力が違うんだろうな〜
0618310垢版2016/10/16(日) 17:19:15.26ID:KTdXBWLt
どもです。評価値問題は治りました。

乱数じゃなくて、ある手順で引き分けな手を選んでしまう事が判明したので探索時間
を延ばしてみたら、逆に序盤で負け手順を選んでしまうようになりました(汗。
ツリー部の地平線臭い感じなのかなぁ。

というわけで、たまたま選んだ1秒が良かっただけかも知れませんorz

MCTSも理論的には探索回数を∞にすると、最善手を必ず導き出す事は保証されて
いるらしいのですが、中途半端な回数の時は保証されていないんですよね。
0619535垢版2016/10/16(日) 21:36:30.64ID:Ts0NTtMt
なんか将棋で評価値を深く探索した時の評価値に近づけるっていう学習方法があるみたいですね。
ちょっと興味あります。
0620310垢版2016/10/16(日) 22:45:31.89ID:KTdXBWLt
なんか、デバッグ報告みたいな状況になってすみません。

地平線臭い状況を調べていたら、負ける寸前なのに評価値が勝ちになってます。
つまり負けを認識していない。

着手を間違えるのはこの辺も原因かも知れません。

ぱっと思いつく原因が見当たらないので、しばし長考します。
0621535垢版2016/10/17(月) 22:03:40.14ID:B9d5KHtX
connect 4序盤ブック作ってみようかな。
完全ソルバ丸パクリでw
0622310垢版2016/10/18(火) 00:57:04.06ID:k8M1GDOc
色々直して、ほぼバグは取れたと思います。
で・・・強くなったはずですが・・・PerfectSolverに先手で勝てなくなりました。
かつて勝てたのはたまたま上手くバグっていたという事みたいです。

1秒設定は途中で間違えて引き分け、10秒設定は初手で負け確定(真ん中以外に着手)。
1秒設定で初手真ん中を選択するのはたまたまかもしれません。
初手だけ調べると150万プレイアウトくらいで間違えはじめ、15億プレイアウトまで確認
しましたが、雰囲気的には当分正しい答えに戻ってこないようです。
評価値の推移を見ると、一本道問題に引っかかっているように見えます。

DAG問題がやっぱり気になるので、ハッシュと組み合わせて合流できるようにしてみます。
多少は改善するかも知れないし、逆にもっと早く真ん中から外れるかも。
0623名前は開発中のものです。垢版2016/10/18(火) 17:50:18.00ID:7idTlLLA
読めば読むほど弱くなるとは不思議
ucbの計算間違えてるとかでは?
0624名前は開発中のものです。垢版2016/10/18(火) 19:31:31.87ID:4bRvdGb+
ボードゲームのオリジナルオーダー制作
http://www.logygames.com/logy/ordermade.html
簡単に本格自作ボードゲームが作れる時代到来!!
http://jellyjellycafe.com/3869
100円ショップでボードゲームを自作しよう
https://sites.google.com/site/jun1sboardgames/blog/makeyourbg
ノーアイデアでボードゲームを作ろう第1回「100円ショップで物を買う」
http://boardgamelove.com/archives/boardgame-make-1/
自作ゲームをゲームマーケットで売って来た
http://portal.nifty.com/kiji/160418196277_1.htm
「街コロ」はカードゲームに興味ありな初心者の入門用に最適、サイコロを振って
カードを集めどんどん自分の街を発展させて勝利を目指せ
http://news.livedoor.com/article/detail/10962802/
ようこそ「男の世界」へ。『ダンジョン オブ マンダム』試されるカードゲーム
http://www.moguragames.com/entry/dungeon_of_mandum/
かわいいひつじを増やして増やして増やしまくれ! “一人用”カードゲーム『シェフィ』
http://www.moguragames.com/entry/shephy/
0625535垢版2016/10/18(火) 22:30:42.36ID:5rT5zFZw
完全ソルバから定石パクるの意外とめんどくさいな。
クローラーみたいにして自動でパクれるようにしようかな。
でも迷惑かかるかな?
0626535垢版2016/10/18(火) 23:07:54.58ID:5rT5zFZw
なんか本末転倒だからやめとくかw
0627310垢版2016/10/19(水) 02:53:35.54ID:YWnebdEb
まさかの場所にバグ発見。
プレイアウトでランダムに1手選ぶところがバグってました。
良く動いていたものだと思う反面、MCTSってそういう所がある事も薄々感じてます。

が、状況はほぼ変わらず。初手真ん中と、5手目真ん中。この2か所が鬼門。

まだバグがあるのかも知れない。やっぱり自分が一番信用できないですね。

DAG問題対策でノードの合流を実装しました。枝とノードを分離して、ノードをハッシュ
にして、ノードの下に次の枝をぶら下げました。同時に、ハッシュキーに細工して、
左右同形も合流させてます。あまり変化はない気が。
速度低下が酷いです。
0628310垢版2016/10/20(木) 00:37:06.99ID:yz39woaL
5手目真ん中以後どうなるのか1秒探索検証。6手目2列目に対しては、勝利(全て
最善着手)。6手目1列目に対しては、5列目着手で引き分け進行に入り、引分終了。
この時の手順では、全箇所が最善手という盤面ばかり通っていくように感じています。
つまり、MCTS的に勝利期待値が最大になりやすい手です。という事で、まあ、そんな
に間違った手は打っていないかなと。

また、プレイアウトを繰り返して手がどう変遷するのか見ていくと、最善手である真ん中
は、ある一定数からほとんど選択されなくなっています。結果、その手で枝の分岐が起き
ない事から、いつまでたっても評価が更新されず正解に戻らないと推測できます。

そこで、試行回数に圧倒的な差ができても、下位の手も一定回数は試行されるように
できないかと、手の選択基準をucb1の大きい順から、ソフトマックス関数を通して確率
分布に変えて、乱数で選択してみました。

結果は・・・。expの計算がある事からか、速度が激減。PVに割り当てられる試行回数は
2/3程度になり、その時点の最悪手でもそれなりに試行されるようになりましたが、それ
でも手の選択は微妙な感じです。この程度の効果なら、他のパラメータいじった方が
速度低下も無く良かったかも(汗

というわけで、本日のトライアルも失敗。
気が進まなかったけど、やっぱりucb1計算の検算をしてみます。
あと、部分的にmin-Maxを適用するとか。
0629310垢版2016/10/23(日) 09:58:44.72ID:qEEwIK82
UCB1の計算は合ってました。
プログラムがC++的に美しくない事が気になりだし始めて、全部書き直ししてました。
書いた端から美しくないのが気になりだしましたが(笑)

UCTで後方枝刈というか、小枝の勝敗が確定していたら、ツリーを縮小していく処理を
追加。一本道問題が多少緩和するかと期待。対戦はちゃんと動いているっぽい。
デバッグ情報をファイル出力する処理書いて確認。
間違え方はあまり変わっていないのが残念というか、安心というか(汗

モンテカルロで1手目から最善手順が確実にわかったら、それはそれでゲームが
簡単すぎるって事になっちゃうので、大きく間違えないんなら、それで仕方ないかな。
というわけで、COM1手目は真ん中に固定。

プレイアウト部を高速化できる気がしていますが、やってみないとわかりません。
プレイアウトの末端部分に完全読みを数段入れるのも良いかと思っています。
DAG問題対応と左右対称チェックを入れて毎秒20万プレイアウトくらい。

評価値の算出方法でちょっと悩み中。

そこそこ落ち着いたらオセロの中盤探索に応用してみます。
0630310垢版2016/10/26(水) 20:47:59.29ID:H5ji3apJ
また美しくない病が出て、書き直したところ、びっくりするほど弱くなってしまった。
しばらくデバッグで悩みそうです。
0631535垢版2016/10/26(水) 20:59:11.78ID:+YpzcPTO
Connect 4は一旦休止して別のゲームのAI書いてます。
マイナーゲームですが囲連星というゲームで囲碁と五目並べを混ぜたようなゲームです。
簡単に言うと、七目並べれば勝ち、囲った石は取れるというルールです。

ついさっき黒番で公式AIのLV0に1勝できました。
(;SZ[19]
;B[jj];W[kj];B[jl];W[ji];B[ik];W[km];B[kk];W[ki]
;B[ii];W[lj];B[ll];W[mm];B[hh];W[gg];B[im];W[ih]
;B[ig];W[jh];B[ij];W[in];B[lk];W[gi];B[hk];W[gk]
;B[mk];W[nk];B[hn];W[hl];B[jn];W[io];B[lm];W[jo]
;B[go];W[fp];B[gh];W[hi];B[fg];W[ko];B[gf];W[ln]
;B[hg];W[jg];B[ff];W[gj];B[gg])

囲連星AIはこちらで配布されてます。
http://www.vector.co.jp/soft/win95/game/se401975.html
0632535垢版2016/10/27(木) 22:26:16.59ID:CgNWWTgQ
LV2からも黒番で一本取りました。
キセキが起きたw

(;SZ[19]
;B[jj];W[ik];B[ji];W[hj];B[jh];W[jk];B[kk];W[jl]
;B[gi];W[il];B[ll];W[hm];B[ii];W[hh];B[hi];W[ki]
;B[mm];W[nn];B[li];W[in];B[kh];W[fi];B[mi];W[io]
;B[kj];W[lj];B[ki])
0633535垢版2016/10/27(木) 22:53:05.70ID:CgNWWTgQ
黒番でLV3からも一本取りました。
なかなかいい感じ。
ここからどう高めるか。

(;SZ[19]
;B[jj];W[ji];B[ij];W[kj];B[kk];W[ii];B[ki];W[lj]
;B[lk];W[jk];B[ik];W[kh];B[li];W[mj];B[lh];W[hl]
;B[mk];W[hj];B[jl];W[hk];B[ok];W[nk];B[nj];W[hh]
;B[nl];W[km];B[jk];W[lm];B[nk])
0634310垢版2016/10/27(木) 23:41:56.56ID:KUg+LQ1A
バグ取れました。わかればどうという事はないですねorz

左右対称はデバッグが面倒くさいので省きました。どうせ序盤でした
意味がありませんので。

初手真ん中は、多分モンテカルロでは答えを出すのが相当厳しいです。
5手目真ん中は、乱数次第みたいな感じで、100万プレイアウトくらいまでに
出るか、1億プレイアウトしても出ないかみたいな感じになります。

一応、DOS窓ベースでプレイできるようにして、途中でMTCSのツリーを
色々と確認したり、追加のプレイアウトをしたりできるようにしましたが、
本質的にモンテカルロなので、完全に近いけど完全じゃないし、乱数の
具合によって着手する手もバラつくという事で勝手に納得してしまいまして、
せっかく作ったデバッグルーチンも禄に活用していません。

高速化も、一時期は40万プレイアウト毎秒くらいまで出たように感じて
ましたが、最終的に20万くらいで落ち着いてしまいました。

次のステップでオセロに応用と思ったのですが、その前に並列処理化を
してみようかと思います。上手くやれば探索ノード数は3倍強(自分のPC
では)くらいにはなりますが・・・数段深く読んだとて、結論にはあんまり大差
が無いのかなと。まあ練習ですな。

というか、min-Maxとモンテカルロのノウハウ、仕事で使えそうだなぁ。
0636310垢版2016/10/28(金) 10:50:00.21ID:/58y3Hfc
いや。趣味の深夜プログラマです。
物流業務改善の会議で提案してみて、わからんと言われたら
ソース見せて動作検証してやろうかなと。

システム屋さんからすると、とてつもなく面倒くさいクライアント
だと自覚しておりまするorz
0637535垢版2016/10/29(土) 21:09:01.77ID:4znFYNwN
囲連星、公式AIとガッツリ対戦してみました。
LV0はdll化されてないので対戦できませんでしたが。。。
結果はLV1には大きく勝ち越しましたがLV2,LV3には敵わなかったです。
airandom.dllが私のAIです。

50局目
黒(airandom.dll)の勝利回数: 44
白(ai-lv1.dll)の勝利回数: 6

50局目
黒(ai-lv1.dll)の勝利回数: 10
白(airandom.dll)の勝利回数: 40

50局目
黒(airandom.dll)の勝利回数: 20
白(ai-lv2.dll)の勝利回数: 30

50局目
黒(ai-lv2.dll)の勝利回数: 41
白(airandom.dll)の勝利回数: 9

50局目
黒(airandom.dll)の勝利回数: 15
白(ai-lv3.dll)の勝利回数: 35

50局目
黒(ai-lv3.dll)の勝利回数: 44
白(airandom.dll)の勝利回数: 6

私のAIが長考するのでこの対戦するのに丸一日以上かかってしまいましたw
0638310垢版2016/10/29(土) 21:13:21.87ID:hyv6QOjp
並列化してみました。

色々やり方ありますが、まあ順当なやり方という事で、ツリー単位の並列化です。
が、4コアに対して4並列でむしろ速度低下。排他で怪しいところを色々変えてみて
ようやく若干(10〜20%程度)の速度アップにしかなりません。並列数を減らすと
速度低下していくので、排他待ちが原因ではなく、並列化オーバーヘッドの模様。
ノード&ツリーの構造で複雑な分、オーバーヘッドが大きくなっているのか、オセロの
時の効果には大きくおよびません。

ルート単位の並列化で、一定時間ごとにツリー統合(合算)というやり方もあるような
ので、次はこちらを試してみます。

もしかしたら、一番効果が無さそうな、プレイアウトのみ並列化の方が効果出たりして。
0639310垢版2016/10/29(土) 21:14:51.22ID:hyv6QOjp
MTCSは並列化と相性が良いとは思えないなぁ。
0640535垢版2016/10/30(日) 23:47:35.70ID:11nwLD7b
return文忘れててめちゃくちゃな値返してた。
この不可解なバグ潰すのに3時間かかったorz.
関数の終わりでreturn文無かったら警告だしてよコンパイラ(泣
まあコンパイラオプション付けてない俺が悪いんだがwww
0641310垢版2016/10/30(日) 23:54:19.10ID:vT6Vi1L+
結局ツリー部の並列化はやめてプレイアウトだけを並列化しました。
ツリー統合も気になりますが、とりあえずこれで末端の評価が正確になります。
プレイアウト部分は処理時間が短いので、プレイアウト回数は大幅に増えます。
MCTSは面倒でも、モンテカルロは並列化向きです。
100回プレイアウトして、そのスコアでまとめて更新。

ところが、バグを発見してしまいました。
勝ち手順で進めていたのに、最後の最後に1手間違えて引分。
もうプレイアウトではなくツリーの勝敗が確定している状態で、間違えるはずがない。
勝敗確定時のフラグ設定がおかしいようです。

そこから色々見直しを始めたら、negaMax的な処理の扱いに完全に混乱して
しまいまして…。これだと思って修正すると、おかしくなってしまいます。
どこか根本的に勘違いしているみたいなので、しばし長考に入りますorz
0642535垢版2016/10/31(月) 00:37:25.82ID:KdjBytFw
なかなかいい感じのルーチンが書けた。
まだ結果に結びついてないけどこれはあと一捻りいれればかなりいい線行くんじゃないか?
0643535垢版2016/10/31(月) 21:35:59.05ID:KdjBytFw
おかしいな。
石の流れは良くなってるのになかなか勝利に結びつかない。
0644535垢版2016/10/31(月) 22:47:38.80ID:KdjBytFw
パラメータ微調整地獄w
機械学習に切り替えないと限界が…
0645535垢版2016/11/01(火) 21:33:50.00ID:pQxzEPLf
あかん。
完全にバランスを失った。
一から出直しだな。orz
0646名前は開発中のものです。垢版2016/11/03(木) 03:15:09.64ID:x7yDYWU2
ボードゲームのオリジナルオーダー制作
http://www.logygames.com/logy/ordermade.html
簡単に本格自作ボードゲームが作れる時代到来!!
http://jellyjellycafe.com/3869
100円ショップでボードゲームを自作しよう
https://sites.google.com/site/jun1sboardgames/blog/makeyourbg
ノーアイデアでボードゲームを作ろう第1回「100円ショップで物を買う」
http://boardgamelove.com/archives/boardgame-make-1/
ボードゲーム市場がクラウドファンディングの出現で急成長を遂げ市場規模を拡大中
http://gigazine.net/news/20150820-board-game-crowdfunding/
0647310垢版2016/11/04(金) 15:36:30.74ID:zGiY9OSz
長考の結果、もう一度作り直し(笑)していたら、混乱の原因がわかりまして。
勝敗の持ち方を逆にしたらすっきりしました。

あと、終盤の手順の前後で、あと3手粘れるのに1手で負けるという現象を調べた
結果、ツリー部で負けと判定している以上、何手先に負けるか関係ないというプロ
グラムになっていた事も判明。バグじゃありませんでした。とはいえ気持ちが悪いので、
なるべく長く粘るようにしてみました。

そこでわかったのは、Perfect Solverの数字は、42手21ターン目の引分から何ターン
前に勝負がつくのかを表していて、プラスは勝ち、マイナスは負けという事です。先手で
+1と出たら最善を尽くせば41手目の自分の着手で勝つという事のようです。
つまりスコアを勝敗決定ターンにしたmin-Maxで、速度考えるとDB化してるんでしょう。

で、MCTSですが、まあやはりモンテカルロなので間違えます。試しに10手目程度
の間違えた局面から、シミュレーションを続行してみたところ、億単位の探索(プレイ
アウトとしては10倍)で、間違えた手が本当は悪かった事に気づいた様子で、そこから
正しい答えに向かって行きました。なので、まあプログラムは間違っていない模様です(汗。

DAG対応とか、自殺手禁止プレイアウトとか、色々やった結果、選択手のばらつきが
減って、「たまたま正解手順を引く」事がなくなって、自信満々に間違えるようになっ
た印象です。それでも、時間をかけて探索を続けると、いつかは正しい答えにたどり着くと。

今となってはあまり意味が無いですが、せっかくなので、ここまで積み上げて来た
ノウハウで、今一度Solver作ってみようかなと。
0648535垢版2016/11/04(金) 23:52:18.01ID:lKhN7bKh
色々ぐちゃぐちゃやってたら計算時間がとてつもないことになってしまった。
0649310垢版2016/11/06(日) 13:49:29.22ID:Z4kqE5wB
Solver作りました。
PerfectSolverにならって評価値を、42手目から何手手前で勝敗がついたかにしました。
お蔭さまで、null window searchが使えるようになり、mtd(f)で高速化しました。
あと、初段のみ単純な並列して、残り28手で6秒強となりました。

そろそろオセロに戻ります。
0650535垢版2016/11/06(日) 17:53:47.27ID:B23WCzGo
終盤28手読み6秒とか凄い
こっちはというとそろそろαβ刈りを習得しなければ…
0651535垢版2016/11/07(月) 00:12:13.27ID:vL8wkeAF
αβできたっぽいです。
というかwikiの疑似コードを完コピしたらうごいたっぽい?という感じで
理解したとはいいがたいですが。
0652535垢版2016/11/07(月) 22:06:07.74ID:vL8wkeAF
え、もしかしてminmaxに比べてαβめちゃめちゃ速い?
なんか間違ってんのかな…
0653310垢版2016/11/08(火) 00:02:22.02ID:CUgV7Bvg
安心してください。めちゃ早いですよw

後ろ向き枝刈系のアルゴリズムはほとんどがαβを前提にしています。
自分の最初は擬似コードコピペしました。
すぐ忘れちゃいますが、1回は真剣に動作を追っておくと良いですよ。
0654535垢版2016/11/08(火) 22:35:11.27ID:BlAmLHY6
評価関数が致命的に狂ってる気がする。
手動で直すのは限界があるから機械学習したいがさてどうするか。
0655310垢版2016/11/10(木) 20:55:19.87ID:gpSCAC4W
オセロでUCTをしてます。コピペでちょいちょいと思っていたらパスの処理が面倒で、
思った以上に動作速度が落ちてしまいました。

その後、デバッグしてたらおかしな現象を発見。探索ツリーでプラスになるべき数字が
マイナスに。しかも1か所だけ。発生条件を絞り込めず、なんだかんだと数日間。

原因は整数のオーバーフローでした。設定時間におけるプレイアウト回数でのスコア合計
がちょうど境目にきて、本当に微妙にオーバーフローしていたので、スコアの正負がひっく
りかえったように見えていたのでした。

俺の時間を返せorz

終盤5手読みくらいならすぐにUCTのツリーが終局まで達して、完全読み同等の答えを
返してくれるのですが、10手だと結構時間がかかり、20手だと全く歯が立たない。
評価関数を使った中盤探索の置き換えに使えないかと想定しているのですが、やはり
簡単に精度は出ない感じです。

プレイアウトでありがちな手を優先的に着手するように、ヒューリスティックな評価関数を
用意して、プレイアウトの精度を高められるか試してみたいと思います。あと、スピード
アップもしないと・・・。
0656535垢版2016/11/10(木) 23:14:15.10ID:4tjjzH07
Zenは治勲と三番勝負か〜
Zen勝ちそうw
0657535垢版2016/11/13(日) 00:19:43.02ID:otFLKKMJ
doubleの有効桁数が足りなくておかしくなってたorz
評価値に差をつけようとして極端にデカい数値を設定してたら
小さい数値が無視されてた
0658310垢版2016/11/13(日) 00:47:25.03ID:Be0ooFvL
DeepZenGo楽しみですね。
ポストアルファ碁の今となってはZenが2勝できなかったらちょっと悲しいかな。


こちらはオセロのモンテカルロツリー探索がほぼできました。
当初かなり速度ダウンしていたのですが、何とか改良できました。vectorが遅かった。
数か所工夫して、テストデータで正解を早く導けるようにしてみましたが、調整が面倒そう。

とりあえずネタ切れなので、次は探索済ツリーを再利用できるようにして、対戦できるよう
にする予定です。で、今一度終盤読み切りルーチンと、序盤の定石DBつけて完成としたい。

しかし、相変わらず評価値をどう計算したら良いのかわからない。
単純に、着手する手の平均スコアだと、探索の進み具合によってあなりブレてしまい
意味がある数字になりそうにない。アルファ碁はDCNNの評価値を使ってるのかなぁ。
0659310垢版2016/11/13(日) 20:49:23.63ID:Be0ooFvL
ちょっと疑念が湧いてきたので数か所工夫したところを全てコメントアウトしてみたところ
やらない方が遥かにマシという結論に(汗。下手な考え休むに至りでした。
全部外してしまうと一旦最善手から外れてまた戻ってくるような事もなくなり、探索時間が
長い方が良いと単純に言えるようになります。

また、評価値ですが、モンテカルロならやはり点差を考慮しない「勝率」であるべきでは
ないかと思い始めています。今は、「点差」を返しています。「勝率」で選ぶ手は、「もっと
良い手があった」となりますし、「点差」で選ぶ手は「欲張りすぎた」となりそうです。

探索済ツリーの再利用の仕組みができました。まだパスがらみのテストはしてませんが、
多分大丈夫でしょう。

ボード関連のクラスをかなり作り直してしまったので、終盤読み切りルーチンや序盤定石
処理を作り直さないといけません。というか、評価関数を持ってないので、終盤探索は
オーダリングの仕方を変えないといけません。

あと、人間側入力待ちの間も探索を継続できるようにしてみたいと思っています。
モンテカルロだと、いつでも停止したり再開できるので、ぜひとも導入したいものです。
0660310垢版2016/11/16(水) 01:01:14.01ID:2m1pjf8n
人間の入力待ちの時のバックグラウンド探索を実装しました。
並列処理はPPLを使ってるので、思いのほか簡単にできましたが、入力待ちのまま
放置されると、数時間でメモリーを食いつぶしてしまう事に気づきました。
パンクしそうになったらツリーをルートに近い順に削除するようにしましたが、メモリー
リークしてそうでちょっと怖いです。

コンピュータ同士で対戦させてみたところ、まあそれっぽくは打ちますが、序盤で定石
から外れてしまいます。終盤は結構正確に見えます。

評価値の件、独自ロジックを外したところ、それっぽい値を表示するようになりました。
0661310垢版2016/11/16(水) 09:03:26.60ID:uZWbEwsE
自分のつたないオセロ力では、モンテカルロが着手した手が良いのか悪いのか
わからないので、どうしようかと寝ながら考えました。

まず考えたのは、完全読み切りルーチンを作って、終盤に限っては正解着手も
探索してみる事。でも、最終的には終盤は完全読み切り使った方が、正確で早い
ので、そちらを使用。中盤や序盤の具合がわからない以上、ほぼ意味なし。

続いて、WZebraにある「解析機能」を実現できないかと考えました。中身はわからない
ので想像。使用して感動した経験あり。
「後ろから解析」なら、αβを後ろから回し、自分が着手した手より良い手が無ければ
βカット、あればそれで生じたスコアの増減を記録という形で、中盤のある程度のところ
までは、遡りつつ誤着手を検出できるんじゃないかなと。棋譜にある着手はこのロジック
で評価が定まっているので、探索を省く事ができます。評価関数を持っていないので、
遡れても30〜35手目くらいまでかと思いますが、読み切りルーチンをいじれば作れ
そうなので、トライしてみようと思います。

誤着手率がわかっても、簡単に直らないのがモンテカルロですが…。
0662535垢版2016/11/19(土) 18:30:11.32ID:X8ZFdPyh
ん〜Zen負けちゃった。
期待してたんだが。
0663310垢版2016/11/19(土) 20:47:46.55ID:F+e1LSRb
とりあえずWZebra相手に戦ってみたのですが、全滅しない程度に負けますw
評価値が全然違うというか、自分は有利なつもりで進んでいても、Zebra的には
+50とかになってます。40〜50手目付近で末端までツリーを展開してようやく
気づくみたいな。そこまで行くと、ほぼ間違えなくなる(当たり前)のですが、序盤
中盤があまりに酷いので、定石ルーチンで助けられないレベルかなと。

そもそも評価値が間違いまくりで、自分のAIは少し有利くらいの勝率になっている
のに、zebraは既に+30とか+50とか。形を見ても、素人目にも全く不利な形に。
ランダム着手で勝率や平均スコア求めても意味が無いかも、という本質的な
課題に突き当たってしまいました。

ツリー依存度を上げようと閾値を下げてツリー展開しやすくすると、あっという間に
メモリが溢れてしまいますので非現実的。本来はucb1の計算が機能して、変な
ツリーに手を回さないのですが、むしろ変な手にロックオンしてしまいがち。
囲碁みたいに、1手の価値や、最終的な形が同じなら着手する順番関係ないよう
なゲームじゃないと厳しいのかなと思い始めています。

相手の入力待ちの時のバックグラウンド探索では、敢えて初手についてのみ全て
の手に均等に割り振って、ツリー展開を進めさせてみたのですが、これもやりすぎ
ると簡単にパンクしてしまうので、ほどほどにという感じです。
アンドゥ機能を消して、終わったツリーをバサバサ消す仕様に変更です。

というわけで、解析とか後回しして、強さを上げられないか検討です。
ヒューリスティックな手法で、プレイアウトをもう少し現実的に。同様にUCB1に多少
細工して、よさそうな手の割り当てを増やせないか検討してみます。といっても、
相手の着手可能位置の数を減らすような手を優先するくらいしか、アイデアはあり
ませんが。
0664310垢版2016/11/20(日) 16:54:24.84ID:4i7ILKOH
「相手の打てる箇所が少ない手を確率的に増やす」程度では全くダメでした。むむむ。

脳内では、プレイアウトの次の1手を決めるのにDCNNでみたいな…本末転倒な対策が
渦巻いてきています(汗。手元にある囲碁のモンテカルロ本(彩の解説、技術的な種本)
でも、自分の石の周辺のパターンを統計的に処理して着手確率を計算みたいな事をして
いまして。オセロでいうと評価関数みたいな事をしていたりします。

オセロは、着手する石の価値が重すぎるので、モンテカルロが向かないって当たり前の
結論ではあるのですが。それにしても、あまりに弱い。

というわけで、ダメ元でプレイアウト時に開放度で着手確率を変える方法を試してみつつ、
技術的勉強で、もう一度、きちんとツリー並列で並列化を実装してみようかなと思ってます。
0665535垢版2016/11/20(日) 21:28:29.17ID:gm8FgHLO
も〜インテルさん早く1ThzのCPU出してよ〜w
0666535垢版2016/11/23(水) 19:46:23.65ID:/Z9U4oFa
Zen負けちゃったか〜
でも一勝しただけでもすごい。
0667310垢版2016/11/23(水) 23:37:07.28ID:wq9OFZ+n
うむぅ。アルファ碁があるから期待高いけど、互先で1勝したのは凄いよね。
まだ伸びしろありそうだから、次回に期待ですね。

こちらは、モンテカルロがあまりにダメダメで悩み中です。

煮詰まってしまったので、ツリー並列をきちんと実装したり、終盤探索作ったりしてました。
終盤探索は、ようやく>>460さん指摘の偶数理論を実装しました。どうやるのかなかなか
思いつかなかったけど、手を動かしだしたらわかるものですね。Zebraとかのソース見て
いないので、もっと良いやり方があるかも知れませんが。
0668535垢版2016/11/25(金) 20:21:12.84ID:udjtSdAy
終盤の打ち方はまあまあいいんだが序盤が致命的すぎる。
思考時間もめちゃめちゃ長いし。
あと強化学習やりたいけどアイディア湧いてこないなぁ。
0669535垢版2016/11/26(土) 14:07:56.90ID:3TEfCPcy
LV2が思考速くて強いからってLV2の棋譜大量に集めたら学習が偏りそう?
0670310垢版2016/11/28(月) 13:44:46.30ID:moEHPVOW
>>669
やってみないとわからないけど、棋譜は質が良くて偏らないってのが基本だからね。
間違えたら間違えたなりに、負けてくれる棋譜じゃないと、変な学習しちゃうかも。

この辺の兼ね合いが難しい。

ただ、スタートの棋譜をその辺にして、だんだん更新しつつ、強くしていくって方法も
あるかと思う。


こちらは、終盤探索に手こずっています。
AVX2命令をオペレーターオーバーロードして使っているのですが、グローバルなのが
気持ち悪くて、クラスに変更。ついでに見直しをしていたら、過去にどうしてもわからなくて
別の方法で逃げてしまったバグをようやく解消。速度には大した影響ないですが。

一番の問題は、評価関数を持っていないので、MPCが使えない事。MPCのスレッショルド
を広げながら置換表使って、moveorderを最適化していたので。他の方法で速度アップを
考えないといけない。逃げてを考えると、結局、NNなりなんなりで別の評価関数なり、次の
1手ヒューリスティックが欲しくなります。もともとNN方面に行ったのは、そこが目的だった
事を思い出しました(汗

モンテカルロは、プレイアウトを疑っているので、いずれきちっとやり直してみます。
0671535垢版2016/11/28(月) 22:46:28.36ID:nf8GSvVi
NN興味ありますねぇ。
Zenチームの人とかがわかりやすい解説本書いてくれないかなぁ。
0672535垢版2016/12/02(金) 21:41:56.73ID:Vv9WnV3F
モンテカルロはやはりプレイアウトの質がカギか?
軽くて良いヒューリスティックが欲しいところだ。
0673535垢版2016/12/02(金) 22:02:53.36ID:Vv9WnV3F
モンテカルロは良い枝をカットしないこともかなり重要とみた。
0674310垢版2016/12/04(日) 20:20:17.67ID:E6FCgpFL
うーん。モンテカルロはFFOなんかで残り20手くらいから戦うと、結構まともな着手を
するんだけど、10〜30手目付近がわざとじゃないかというくらい悪い手ばかり選択する。
残り10手くらいまで行けば完璧。

序盤は次の1手が多すぎるのと、プレイアウトで回す回数が単純に多いので、ツリー部が
なかなか深くならないし、あまり簡単に深くするとすぐにメモリーオーバーフローしちゃうし
で難しい。

>>673
UCTではカットはしません。単純にプレイアウトの割り当ての順番がなかなか回ってこなく
なるだけです。良い手に優先的に割り当てさせるためには、やはりプレイアウトで良い手は
良いと、悪い手は悪いと評価できなきゃならんわけで。それが難しいからモンテカルロだと
言う矛盾。

まあ、オセロの場合は、伝家の宝刀評価関数があるので、プレイアウトを20手くらいで
打ち切って、評価値を返すとか…MPCみたいな事をして無駄な着手を回避させるか…
と、本末転倒な妄想をしてます(汗。良くなる点は、時間管理が易しくなるくらいかな(涙。
0675310垢版2016/12/06(火) 00:37:18.95ID:zUbz1knV
モンテカルロが弱い理由を探ってます。

WZebraと対戦させると、一番顕著なのは、モンテカルロは辺に着手したがり、その結果
WZebraに内側に潜りこまれて選択肢が減っているという事です。流石に×とかCには
簡単には打ちませんが、序盤からあっさり中辺に出て行き、更にあっさり辺に打ちます。

相手もランダムに着手したとすると、辺の石は1方向からしか返せない(内側は4方向)
ので、プレイアウトでは残りやすくなると言う仮説を立ててみました。つまり全部で28石
ある辺の攻防が相対的に下手くそになるため、プレイアウトの結果が楽観的になりすぎ
ているのではないかと言う事です。

残り20手切ってくると、ツリー展開できているので、min-Max的に攻防できるけど、それ
より前の段階ではプレイアウトで、相手のミスを咎めるような手を打たないといけないと
言う事かなと思います。

これをどう次の1手の確率分布に表現するかですね。
0676310垢版2016/12/11(日) 01:06:32.29ID:8cq3+Gjk
なんか袋小路に入ってます(汗

プレイアウトの改良は速度低下との戦いになり、効果が出ません。
結局、とにかく無駄をそぎ落とし、単純化してプレイアウト回数を稼いで、なおかつ
ツリー展開の閾値を下げて、ツリーに頼る形になりました。

が、ここでメモリーパンクとの戦いが始まります(涙
中盤の分岐が多い局面だと、あっという間にツリー部で8ギガくらい使ってしまいます。
更に処理を単純化してメモリー使用量削減に走る事に。

結局、40手目以後なら使えるけど、それ以前ではあまり精度が期待できないという、
当初やりたかった、少しマシな序盤・中盤探索という目論見は崩れてしまいました。

評価関数があるんだったらαβの方がマシという当たり前の結論に傾きつつあります(汗
0677310垢版2016/12/11(日) 23:57:52.07ID:8cq3+Gjk
たった一晩で楽観してきました。

今までsoftmaxで確率分布を変えていましたが、あまり大きな差はついていないようだった
ので、この際、思いっきり割り切ってみました。1位に70%、2位に25%、残り5%で他の
手に均等割り。イメージとしては1σ、2σ、その他って感じです。ヒューリスティックは
αβのmoveorderのものを使用。

もちろんzebraにはぼろ負けですが、今までと違うのは、相手を囲んで着手可能位置を
減らしてしまう事が無くなりました。ちょっとした手ごたえを感じています。これをスタート
に、ヒューリスティックに終盤変化を組み込んだり、序盤は開放度にしてみたりして検証
しようかと思っています。プレイアウトの精度があがったら、無駄にツリー展開しなくて
済むので、メモリーにも優しくなれるかも。

また、敗勢での発狂モードや、勝勢での手抜きモードの原因は、勝敗が明らかになり、
手毎の勝率の差がなくなる事が原因です。プレイアウト回数が多いからか、評価値は
かなりデジタルに変化するので、25%、75%などを境目に、石差評価に変更すると、
ある程度回避できるんじゃないかと思います。
0678310垢版2016/12/19(月) 00:57:35.60ID:V27xPT8O
地味に色々改良。素UCTに色々追加してます。
・uctの終盤にsolverを組み込んだ
・手の割り振りに全手均等な部分を作って読み抜けの可能性を減らした
の2点が主な追加点です

当初想定していたより結構強くなったと思います。

AI黒番30秒探索。zebra思考中にもMAX30秒探索で、zebraに対しては20石強負け
くらい。序盤1回間違えて、中盤ジワジワ差が広がって、40手前後で読み切りできず
に間違う感じ。序盤は定石で回避できると思いますが、中盤の間違いは2番手の手を
選んでしまいます。修正は難しい感じ。終盤はチューニングか、探索時間延長で対応
できないか検討。

テストで作った20手目で黒+12(zebra評価値)程度の盤面からは、zebraが間違える
のか、終盤に入るところまで、かなり押してまして、読み切りミスで22石差→16石差と
ぬるい手を打ちましたが、勝ち切る事ができるようになりました。

ここから先は、レーティングが欲しいなぁ。
オセロでAI使用OKなところないですかね?
0679310垢版2016/12/22(木) 01:29:32.37ID:4YVdXlZ1
地味に色々改良した結果、あらかたボツにしてます(汗

発狂モード対策でスコア最大化を図ろうとしていましたが、極端なスコアが悪さしている
ようなので、結局勝率のみに限定しました。この時点で終盤はsolver任せに方針転換。

で、勝敗のみにした事で、solverの探索範囲を+-1のシングルウィンドウにできて
スピードアップしたのでプレイアウトのラスト7手くらいでも使用する事にしました。
プレイアウトでは、moveorder順の下位はバッサリカットしました。酷い手が混入する
とスコアが散らかるので。

uctのif分ネストがスパゲッティ化したので、処理順を大幅に見直したら、時々落ちるように
なってしまった。並列化が原因かそれともshared_ptrの使い方が悪いのか、散々調べた
結果、ちゃんと全体をリビルドすれば回避できる事が判明。俺の時間を返せorz

テストで使用している引分手順30手目から開始すると、たいていは負けてしまうけど、
希にzebraが認識していない勝利手順を見つけて勝つようになった。乱数の具合なので
再現性は低いけど、zebraの評価値にも間違いがある事を実感した。

ここのところ30手目〜40手目をターゲットに改善していたけど、それなりに成果が出た。
40手目以後はsolverを使用し、対局開始は定石DBを20手分くらい用意したら、まあまあ
なAIになるかなぁと思い始めました。ただ、1手30秒考えるのは長すぎるなぁ。

あと、正しい手順を見つけ勝率も上回って来ているのに、探索時間が足りずにプレイアウト
回数で負けて最善手が選ばれないケースが散見されます。ものの本だと、そういう時は
探索時間を延長するとか書かれていますので、対応してみようかと思っています。

というわけで、なんか行けそうな気がしてきた。
0680310垢版2016/12/27(火) 01:58:53.16ID:lSRXuhfg
uctの探索部分がある程度できたので、とりあえずDOS窓ベースでゲームとして成り立つ
ようにしました。edax-pvbook_2009.wtbから作った40手分の定石DBをつけて、終盤探索
は40手目からsolverで。multi probe cutできないので、FFO#40で1.3秒程度の性能です。
その他諸々。探索時間延長とか。タイマーを作り直してプログレスバーつけたり。

WZebraの20手読み、定石DB変化大相手に、まれに勝ちます。直接対決はまだして
ませんが、以前自分が作ったmin-Max版よりちょっと弱いくらいかなという感触です。
モンテカルロは乱数がらみで、ナチュラルに変化しちゃうので、5〜10手に1回程度は
ミスをしちゃう感じです。

プレイアウトはもう少し詰められそうだけど、まあこの辺が潮時かなぁ。

次は何しようかな。
0682310垢版2016/12/28(水) 10:02:51.11ID:8e16q4EG
vectorは考えてないですが、どこかでソース晒しても良いかなと思っています。
しばし検討。

なおUCT探索の探索時間は30秒にしてます。微妙な時は10秒づつ探索延長します。
また、人間が長考すると、その分だけバックグラウンドで探索が進んで強くなります。
気が長い人におすすめです。
0683名前は開発中のものです。垢版2016/12/29(木) 00:29:19.19ID:T+iok27x
GGSってまだあるんだっけか
トッププログラムの開発者はみんなあそこで対戦しつつ改良してる
0684310垢版2016/12/30(金) 02:11:45.43ID:iZpfxqhq
>>683
GGS探したけど見つかりません。
オセロのAI自体、行き着くところまで行っちゃってるからなぁ。

コメントの整備をしていたら、細かいところが気になって、あちこち手を入れています。
手を入れながら、UCTの探索結果があるので、それでmoveorderすれば良い事に気が
つきまして。SOLVERが少し早くなったので、終盤探索は38手に格上げ。

しかし、テストプレイしていたら、SOLVERのバグ発見。終局まで打ち続けると、50手目
近辺で間違えます。並列探索部分で、negaScout的に再探索かかったあたりにバグが
ありそうという所まで絞り込みましたが、ちょっと厄介な感じ。

ソース晒す用に昔使ってたDTIのホームページを使えないか調べたら、サービスごと
終了してました(汗。

久々にオセロAIで検索したら、MLPでAIのテストをしている人がいました。評価関数では
なく、次の1手で使っているようです。比較的軽い構成なので、気が向いたらもう一度、
トライしてみようかと思います。
0685310垢版2016/12/30(金) 20:08:38.43ID:iZpfxqhq
バグ直りました。数日前に速度アップできると思いつきで直したところでした。
直ったは良いけど、何故バグるのか理解できないorz
0687310垢版2017/01/02(月) 09:01:41.61ID:YMPtqKka
いま、Bloogerにサイトを作ってやっつけで解説文を作ってます。
あらかたできたら公開します。

が、解説していると細かいバグを見つけて、直して確認が必要になるという…。

やっぱ次はディープラーニングですよね。Eigen使ったMLPで次の1手をやってみます。
DCNNももう一度トライしたいと思っていますが、貧弱なパソコン環境ではどうにもならない
かも知れない。
0688535垢版2017/01/06(金) 21:06:02.45ID:/dmWmgCn
ネット碁でアルファ碁が無双してるみたいですね。
60連勝?とか凄すぎw
0689310垢版2017/01/09(月) 14:10:27.74ID:kUxHCmxW
60連勝の相手が、マジトップ棋士だってんだから、あきれるしかないですね(笑

解説書きながらソース見てたら、色々直したくなってしまい、泥沼化しています(汗
強くなったと思ったら弱くなっていたというのの繰り返しです。
0690535垢版2017/01/15(日) 01:15:01.84ID:FqCBSr/V
TensorFlowで学ぶディープラーニング入門って本読んでます。
かなり易しく書こうとしてるのが伝わってくる本なんですがそれでも難しい。orz
0691310垢版2017/01/16(月) 13:21:19.22ID:Cfoi8GBB
カーネルサイズとかチャンネルとかフィルターのあたりですか?


僕の方は・・・モンテカルロだから間違えると思って、思考時間を増やしたり、末端ノードで
1回づつじゃなくて、100回づつプレイアウトするようにしたりして、プレイアウト回数を稼い
だところ、「同じところで同じように安定的に間違える」ようになってしまいまして(汗。

プレイアウトは適当でも、とにかくツリー展開させるか、それともプレイアウトである程度
正確な勝率を得るけど、ツリー展開は減らさないように努力するのか。その辺で、また
悩み始めてしまいまして。edaxの引き分けBOOKから何か情報が取れないかと頑張って
ますが・・・。そろそろ飽きてきちゃったんだよなぁ。
0692535垢版2017/01/16(月) 21:00:44.96ID:UThQer2a
専門用語はよくわかりませんが、付属のサンプルコードをなんとなく動かしてます。
行列と誤差関数を定義してやればtensorflowが勝手に最適化してくれるとか。

成果でないとめげてきますよね。
ここらで一発アルファ碁級のブレークスルーが欲しいですねw
0693310垢版2017/01/16(月) 22:06:12.04ID:cVXIBPCK
あれはやっぱマシンパワーが・・・

一旦計算できちゃってもそれなりの重さなんだけど、学習しようと思うと重さにめげます。
というか、やる気すら起きないレベルorz


とりあえず、実際の最善手順が、ヒューリスティックの何番目かを統計的に処理して、
プレイアウト関数の手のバラつきを表現しようかと思って、プログラム作ってEXCELで
集計して、それなりに計算が簡素にできる形に変形してなんてやりましたが、やった
所で、何番目を選ぶかはランダムではなくて理由があっての事なんだよなぁと…

ちっとマシなヒューリスティックとか言い出すと…できない事をしようとしている事に深く
思い至るわけで。
0694310垢版2017/01/17(火) 00:25:27.65ID:SLwZ7IwS
統計処理して作ったプレイアウト関数も結局ダメでしたorz
最後はやっぱりBOOK頼みになっちゃいます。

もう一回NNに行って次の1手計算させてみるべかな。
0695535垢版2017/01/17(火) 21:19:41.12ID:wCDEMY6U
モンテカルロ木探索ってわざと悪い手打ってる?ていうぐらい期待外れの手を打ちますねw
プレイアウトの質改善が必須か…
0696310垢版2017/01/17(火) 22:04:13.23ID:SLwZ7IwS
例えば40手目くらいの盤面で、UCTの選択基準であるところの実行回数で次の1手を
並べると、トータルではzebraの完全読みの良い手から順に並んでくるんだけど、ところ
どころ順位が入れ替わるんだよね。その入れ替わる場所が、1位と2位とかだと−2して
しまうし、時々−10くらいの手を選んでしまったりする。

囲碁のプレイアウトをちょっと調べたら、やっぱり盤面のパターンを評価して、次の
1手の順位を決めて、点数に応じて着手確率を変えたり、あからさまに悪い手はカット
するみたいな事をしている。そちらの知見では、良いプレイアウトなら回数は少なくて
も何とかなるみたいな話になってる。

今の相手着手可能数ベースで、edaxのpvbook_2009の最善手順を評価すると、1位の手
が選ばれている確率は42%くらいで、2位で17%と、思いのほか手が散っているんです。
これ、同点1位は、ソート順で2位以下にするのではなく1位にまとめるようにしてあるから、
マッチング率が想像していたより悪いって事になります。

別の方法で次の1手ヒューリスティックを作って、一致率を例えば75%〜80%くらいに
までできないかなぁと思いまして。結局、もうしばらくモンテカルロを継続する事にしました。
NNに行く前に、縦横斜めのパターンでベースとなる一致率を作ってみようかなと思います。
0697535垢版2017/01/21(土) 14:40:41.23ID:7GkfgTKT
プログラム作るなら単体テストは必須ですね…
後から後からバグが溢れてくる…
0698535垢版2017/01/21(土) 15:30:15.75ID:7GkfgTKT
机上デバッグはいやだお…T△T
辛すぎる…
0699310垢版2017/01/22(日) 23:15:41.71ID:7cgxubHE
思いっきり同感だけど、結局サボるというorz

実はモンテカルロやってるから見なかった事にしているけど、Solverにバグがあります。
発生する条件も薄々わかっています。いつの間にバグを仕込んだのか。

さて、プレイアウトのヒューリスティックですが、縦横斜めのラインで、その形が現れた
回数、着手された回数のデータベースを作って、プレイアウトの次の1手の時に、それ
ぞれの確率を縦横斜めで集計して、その高い順にsoftmaxで確率分布にして、着手を
選択させる形にしました。

結果は・・・。ヒューリスティックの次の1手としての精度はいまいちですが、それでも
上位3〜4位くらいには最善手が入ってる感じになります。でも、評価値が極端に出過ぎ
ている感じで、ダメダメな感じになりました。確率のバラつきが小さいように感じたので、
ちょっと修正してみましたがダメなので、思い切って累積確率50%でカットしてみました。
この辺で大体3〜4位までの着手になります。少しマシになったけど、やはりダメ。

softmaxの計算が重いため、プレイアウト回数が1/7くらいに減ってしまうんだけど、それを
補う精度が出ていない感じです。楽ちんなのでunordered_map使ってますが、もっと速度を
出そうと思うんなら、他の方法を考えた方が良いかも。

簡潔なプレイアウトで秒間プレイアウト数を稼いで、枝を伸ばす方向に逃げたい気持ちを
ぐっと抑えつつ、引き続いてニューラルネット系で次の1手を求めてみたいと思います。
更にスピード低下するので、いま以上に精度が出ないと・・・。
0700535垢版2017/01/23(月) 23:10:08.18ID:ii9ofJgq
黒番限定ですがLV2に勝ち越せる?というところまで来ました。
何をやっているかというとLV2とLV3を対戦させた棋譜を大量に集めて、
LV2に勝てる手順のDBを作ってナゾルということをやっていますw
まあほとんどチートみたいなものですが、棋譜を集めれば集めるほど
勝てるようになるのでなかなか面白いです。

白番だとLV2が盤の中央からゲームを始めないのでうまくいかなかったりしますw
0701名前は開発中のものです。垢版2017/01/23(月) 23:46:45.10ID:ii9ofJgq
勝利手順のDBからディープラーニングで評価関数を抽出することを考えていますが
今のところ全くうまくいく気配がありませんT△T
0702310垢版2017/01/26(木) 21:23:21.53ID:foYEIc8+
>>700
Buroさんは逐次的にBOOK学習やってました。
僕は論文が理解しきれなかったのと、それやると特定AI相手だけに強いAIが作れて
しまうので禁じ手にしちゃいましたが、オセロというゲームの底の浅さからすると、
それが正解かも知れない(汗

デバッグ兼ねてZebraと対戦していたら、ZebraのBOOKが強化されていくのが実感
できてしまいました。
0703310垢版2017/01/26(木) 21:32:27.07ID:foYEIc8+
さて、本日は非常にショックな事が判明しました。

次の1手を求めるNNを作って、大体できたのでAIに組み込んでました。
NNは以前にEigenで作ったものの流用改造。とりあえず学習結果が確認できる
ところまでやったら、コンパイルが通らない。C2059というエラー。前にも何回か
出ていて、ライブラリの順番いじると直るので放置していた奴。何かの名前が
組み込んだライブラリ間で衝突していると起きるらしい。それが途中からどうにも
直らなくなってしまった。

で、ようやく重い腰をあげて何が衝突しているのか調べたら、A1とかC1とかの
着手位置を表す#defineの定義が、Eigenの内部の型か何かの定義と被ってる。
こちらは#defineなのでnamespaceで回避できない。

楽に回避できる方法を色々考えたあげく、結局、C++良く知らなくてCとしてプログラム
書いていた頃から引きずって#defineを使っているのが悪いのだと気が付いて、
クラスとenumで対処するという、全面作り替えにする事にしてしまいました。

というわけで、修正に3日くらいかかりそうですorz
0705535垢版2017/01/26(木) 21:43:44.99ID:NsrLS1+v
>特定AI相手だけに強いAIが作れて
ディープラーニングが成功すれば汎用度もちっとは違うのかもですが。
0706535垢版2017/01/26(木) 21:54:02.30ID:NsrLS1+v
強い詰みルーチンが欲しいですねぇ。
DBでほぼ勝ちという局面にもっていってもポロッと落とすことが結構ある。
0707310垢版2017/01/26(木) 21:56:01.75ID:foYEIc8+
あ、もしかしてenumってunsigned __int64が使えないのか・・・
0708535垢版2017/01/26(木) 23:23:42.26ID:NsrLS1+v
DBは勝率で手を選ぶよりも累計勝利数で手を選んだほうが良いっぽい。
そのほうが勝利再現率が上がるっぽい。
0709535垢版2017/01/29(日) 01:07:10.63ID:uZb/TXFd
負けた手順に対して手動でDBを修正するという汎用性がみじんもない作業を始めましたw
なにかドカンと強くなる方法ないかなぁ
0710310垢版2017/01/29(日) 13:11:46.36ID:rGbRSmBn
enumで__int64使えますね。というか、どこかのバージョンから使えるようになってましたね。
何か裏ワザ的な使い方考え付かないかと思って試しましたが結局ダメで、前から気になって
いた箇所をクラス化しだしたら大規模改造になってしまいました。

オブジェクト指向を忠実に実行しようとすると、結局何度もライブラリ作り直す羽目になると
いう本末転倒な状態(汗


色々ドタバタしていたので、オセロ共通のクラスのみ修正完了。ロジック部分はこれから。
0711535垢版2017/01/30(月) 23:07:35.87ID:nIJrclSx
ファイル出力が思いのほか重い。
知識では知ってたけど今回、実感しました。
DB作るときは棋譜をまとめて読み込んで書きこみは1回だけとか工夫しないとだめですな。
0712310垢版2017/01/31(火) 01:06:15.90ID:tF0OU/RM
>>709
ドカンとは強くならないけど、やっている事から推測すると遺伝的アルゴリズムが
合ってそうな気がします。茨の道ですが(汗

>>711
いまどきはメモリが大きいので、全部読み込んで一括処理とか、思いのほか可能ですね。
0713310垢版2017/01/31(火) 01:17:50.59ID:tF0OU/RM
困った。3層MLPで次の1手を、
http://qiita.com/kanlkan/items/6bff417519ed7d5ce4da
を参考にして求めている(若干やり方が違う)のだけど、思ったように学習してくれない。

NNの計算どっかおかしい気がしてきたorz
0714310垢版2017/02/01(水) 15:57:52.90ID:DrzIg7bz
ひょんな事から学習できました。デバッグ用に学習データを減らしてテストをしようとしたら
学習できてしまいまして。件数を増やすとダメになる模様。

これは仮説ですが、多種多様な棋譜を学習させると、ネットワークの自由度が不足して、
ウェイト更新が相互に打ち消し合った結果、ウエイトがゼロ(勾配消失)に陥ってしまうと。
学習に失敗した時は、大半のテストの結果が、全て同じ確率(softmaxのため)となってい
ます。中身は見ていませんが、softmax関数を通す前はオールゼロとなっている事が十分
に想像できます。

今から思うと、NNで評価関数を作ろうとして失敗していた時も、同じ状態だったのかなと。


学習データを減らすと精度が落ちますので、ネットワークをより複雑かつ大規模にしない
といけないのかなぁと。結局、同じ問題(ネットワークを大規模化しなきゃいけないけど、
自前のパソコンでは計算が厳しい上に、結果を使用する方もタイムクリティカルなので
あまりややこしくしたくない)の周りをグルグルしはじめてしまいました(汗
0715535垢版2017/02/02(木) 23:55:47.04ID:JZtX1mUx
まとめて読むようにしたら3日かかったDB作成が数分で終了しましたw
しかしDBがかなり肥大化してしまいました。
読み込みに5秒くらいかかる。
しかもこの手法だとLV2には勝てるけどLV3には勝てないし。
LV2はパターン少ないからDBで勝利手順なぞれるけどLV3はパターンが多くてカバーできない(多分)。
そろそろ別の手を考えなければ。
0716535垢版2017/02/03(金) 20:14:00.97ID:jkxdJ711
DBを使ってモンテカルロ木探索の探索結果を永続的に蓄積するというのをちょっと思案中。
計算すればするほどDBが洗練されていく感じで。
0717310垢版2017/02/03(金) 20:39:47.64ID:dv6j41bl
>>716
同じ事妄想したけど、それなら後方枝刈付のmin-Maxの探索結果をひたすら
ため込んでいく方が容量的にも速度的にも有利で、それができないからモンテ
カルロだって事に思いいたりました(汗

min-Maxなら、いらない枝カットできるかと思いきや、相手がそこに打っちゃった
時の事を考えたら捨てられない事にも気づきました(汗汗

で、適当なところだけ保存して、残りは別途探索・・・って、これ定石DBやん!

というオチでした。
0718名前は開発中のものです。垢版2017/02/03(金) 20:45:51.93ID:jkxdJ711
ボツ案でしたか。
でもまあ、とりあえずDBを充実させる方向でやってみます。
他に案がないので。
ディープラーニングがうまくいけばなぁ。
0719535垢版2017/02/03(金) 20:49:10.94ID:jkxdJ711
今のところ黒番対LV2は2勝一敗ペースてな感じです。
もっと勝てるかと思ったけどそうでもないですね。
0720310垢版2017/02/03(金) 20:58:39.46ID:dv6j41bl
こちとらディープラーニングで完全にドツボってますorz
0721535垢版2017/02/04(土) 19:33:24.33ID:neMma6zi
ディープラーニングは盤面情報だけじゃなくてこちらでなにがしかの特徴量を計算してやって
その数値も食わせたほうがすこしはましになるんだろうか。
0722310垢版2017/02/04(土) 20:57:26.78ID:ycMSfQXf
オセロではBuroさんの評価関数と同じ特徴を入力にしたMLPで評価関数を作った
オセロプログラムがあります。vsOthaというソフトです。

今回はディープなので、できれば特徴量は自動抽出してもらいたいものではあります。
一応、黒白の盤面情報の他、着手可能位置は与えています。

と、ここまで書いて、着手可能位置を求めるように学習させられるのか、ふと気になった。
何らかの事前学習に使えそうな気がする。

やらずに悶々としているだけなのですが、DCNNの四角い窓ではオセロの特徴はうまく
抽出できないのではないかと思っていますが、他に方法が思いつかないのが悲しい。
0723名前は開発中のものです。垢版2017/02/05(日) 08:03:16.57ID:36jlTAsU
そうかそうか
0724535垢版2017/02/07(火) 20:48:43.68ID:qiXxRrUf
機械学習じゃだめだ、手書き評価関数しかない…
しばらくするといや、手書き評価関数じゃやっぱりだめだ、機械学習だ…
の無限ループw
0725310垢版2017/02/08(水) 21:46:39.89ID:GrcF81sn
昔mnistでオートエンコーダのテストした時のように、学習内容(ウェイト)をBMPにして
可視化してました。テストに時間がかかるので、色々すったもんだバグとりに時間が
かかってましたが、ようやくなんとか表示できるようになりました。で、とりあえず想定より
少な目の隠れ層4096個でテスト開始。

勾配ノイズ(焼きなまし)の設定値もでかすぎたので、設定値を自動計算するようにしたり。
NN復活当初うまく動かなかった原因がこれでした。

で、まだ学習途中なのですが、ウェイトデータ見ると192個(=64×3)毎に1ビットづつ
ずれるパターンに収れんしていっています。192といえば入力データのサイズで、
横に64個づつ並べたビットマップ画像に、まるで光子の回析実験のような縦じまが(汗
そんな周期性が生まれるはずがないので、どこかにバグがあるんじゃないかと。
表示するプログラムのバグかも知れないけど、1エポックに3時間かかるので、止めて
デバッグに入るか、それとも続行するかで悶々中…。

どっちにしても時間がかかるので、裏でDCNNをもう一度コーディング開始。
あまりにネストが深いのでミニバッチは一旦放棄してSGDで。
GoogleのTensorFlowがテンソルな意味が良くわかった。
DCNNだと元データが2次元で、更にチャンネルがある行列では次元が足りないorz

今最大の懸案は、とりあえず隠れ層4096でオートエンコーダの事前 学習しているけど、
それが終わり全体の学習にいって上手く行かなかった時、中間層を増やして再トライ
するか、それともDCNNに行ってしまうか。
0726310垢版2017/02/08(水) 21:47:47.17ID:GrcF81sn
>>724
そこは…絶対的に機械学習である!という信念が必要だと思います(汗
0727535垢版2017/02/09(木) 22:03:30.31ID:qkkjChao
>>726
そうですかw
まあそんな気もしますが、でも終盤の積みルーチンだけなら手書きでイケそうな気もするんですよねぇ
そこだけでもなんとかできれば…
0728535垢版2017/02/10(金) 19:40:14.89ID:M6OFVkZO
黒番だとDBのせいで対LV1よりも対LV2のほうが勝率いいみたいw
めちゃくちゃ歪んだAIになってしまったw。
0729310垢版2017/02/10(金) 23:52:07.84ID:HUcinQI4
3日かけて学習したオートエンコーダ型はやっぱりダメでした。
可能性すら見えなかった。

というわけで、開き直ってDCNN開始。
前回はオセロ専用で展開形を作ってましたが、それではmnistなどでテストできない
ので、max_poolingも含めて、本格的にちゃんとしたものを作ってみました。
とはいえ、まだ畳み込み層の誤差逆伝播の解釈が正しいか、自信はありません。
また、テストで動かしたところ、なんかすごく重い印象です。

ちゃんと動くのかなぁ。
0731310垢版2017/02/13(月) 22:45:03.11ID:d/p+PbrG
>>730
そのmimosaのサイトがリンク切れで見つからないのです。
0732310垢版2017/02/14(火) 20:21:59.60ID:lpq90WbI
自作ライブラリにDCNNのレイヤーを書いたのですが、あまりの計算時間にデバッグ中に
めげて、試しにtiny_dnnというC++専用のNNライブラリを入れてみましたところ、自作の
10倍以上の速度で・・・こちらに乗り換えです。

で、tiny_dnnでmnistやって感度をつかんだところで、オセロの盤面を変換する処理を
書いて、小手調べに簡単なネットワークで動かそうとしてみたところ・・・盤面データの
変換の段階でメモリーが溢れて盛大にスワップ開始(^^;

5000,000盤面×100マス(Padding含む)×4チャンネル×4バイト(float)でデータだけで
8Gbytes。自分のパソコンのメモリーは8Gで、空いているメモリーは5Gちょいとメモリー
不足が判明しました。

いまどきのパソコンはメモリーでかいから一括でも大丈夫とか言って、このざまです(笑)。

tiny_dnnは全データ一括で渡して指定エポック回してくれる仕組みなのですが、仕方ない
ので、入力データを分割して、自分でループ回します。

α碁のハード環境がうらやましいorz
0733310垢版2017/02/15(水) 23:06:48.81ID:DozmM7Z3
色々細かく改造。やっぱライブラリがあると気が楽です(汗

簡単なネットワークの初期の学習の具合では正答率50%くらいが上限な印象だったので、
ネットワークを複雑にしてみました。で、1エポック8時間以上かなぁ。

もっとハードを・・・って真剣に思いますorz
0735310垢版2017/02/19(日) 20:31:51.68ID:PM1ZzNLK
DCNNで学習させてるのですが、あまりに時間がかかるので、裏でもう一度
アルファ碁の論文を。日本語解説ページがいくつかできていて助かります。

で、読んでいたら、ロールアウトポリシーなる線形Softmaxでプレイアウトの
手を選択していると・・・。つまりはオセロ評価関数のような特徴を渡して、線形
回帰の代わりに出力をSoftmaxで確率分布にしたものです。
ロールアウトポリシーは棋譜との一致率が25%程度だけど、計算が圧倒的
に速く、このばらけ具合がちょうど良いとの事。

むむむ。アルファ碁はプレイアウトの手の選択にDCNN使ってないのねorz

日本語解説のおかげで、MCTS部の構造もようやくわかった。
いくらマシンが早くても無理だろと思っていた計算も、これなら何とかなりそう
レベルの構造に落とし込まれていて、納得しました。

でも、実はまだインプットに何を食わせているのかが、よくわからない(汗
0736535垢版2017/02/19(日) 22:19:16.15ID:FX6EUVR+
ついにアルファ碁論文まで…
英語かつ有料記事ということで私は手を出せずにいましたが日本語サイトもあるんですか。
ちょっとググってみるか…
0737310垢版2017/02/20(月) 20:05:00.30ID:L40mCRWI
論文自体はだいぶ前にダウンロードしてたんですが(汗
MCTSやらない段階では、やはり理解は難しかったと思います。
DCNN部分の投入データあたりは囲碁の知識が必要だったりしますので、
まだよくわからない点が多いです。

で、MCTS的な視点から眺めると、巷の解説とは違うところにフォーカスが
あたったりします。強化学習使ったRL PolicyはValue netの事前学習で
使っていますが、プレイアウトの手の選択では線形Softmax、ノードの分岐
では教師付学習のものを使用しているなど、工夫が見られまして。オセロ
は既に評価関数があるので、無理やりDCNNしなくても応用が効くのでは
ないかと思ったりします。

とはいえ、今学習中の奴は、学習終わるまで1ヶ月くらいかかりそうではあり
ますが、どこまで手の一致率が高められるか、見てみたい気もしています。
0738310垢版2017/02/20(月) 20:09:54.18ID:L40mCRWI
追記。なんか格好良く書きすぎですね。

ちょうど今MCTSで悩んでいる箇所に見事な回答を与えている点に感動。
日本語で読めたので、そこに速攻で気づく事ができたという事で。

とはいえ、アルファ碁の線形SoftmaxによるRollout関数の入力データは、
囲碁の特性がわからない事から、意味不明な事もまだあり、いずれにして
もそのままでは使え無さそうで、オセロに合わせて別途考えるしかなさそうです。
0739535垢版2017/02/23(木) 20:58:02.50ID:ONUfwXLw
連続対戦してると突然落ちるバグがあるっぽいが意図的に再現できない。
どうデバッグすりゃいいんだ。orz.
0741535垢版2017/02/24(金) 21:40:56.21ID:sIjNtQpy
コアダンプの吐かせ方がわからん。T△T
デバッグオプション付けてulimit -c unlimitedだけじゃだめなんか。
ちな環境はcygwin。
0742名前は開発中のものです。垢版2017/02/24(金) 21:43:59.65ID:P/wI/gFl
age
0743535垢版2017/02/26(日) 00:05:27.56ID:TbeyqTpr
やっと落ちてる場所見つかった。
ぬるぽだった
0744535垢版2017/02/26(日) 23:30:45.62ID:TbeyqTpr
特徴量とか便利すぎる言葉考えたやつ誰だよ。
いつでも特徴量が効率よく計算できるとは限らんだろうが。
マジムカつく。
0745310垢版2017/02/27(月) 01:19:56.03ID:kLJ7ziJk
全く同感orz
0746535垢版2017/02/28(火) 21:58:57.62ID:+JAecqpe
ファイルに2Gの壁とかあんの?
2G以上のデータはどうやって受け渡せばいいんだ。
0747名前は開発中のものです。垢版2017/03/01(水) 12:15:45.60ID:jElZYckW
「29歳既婚、2年前に会社を辞めた。ボードゲーム作りを始めて3700万円を
売り上げたけど何か聞きたいことはある?」回答いろいろ
http://labaq.com/archives/51880196.html
日本ボードゲーム界の異端児に聞く!ボードゲームデザイナーとして生きていくには?
https://bodoge.hoobby.net/columns/00013
QRコード・クトゥルフ神話・24世紀などユニークすぎるデザインてんこ盛りのサイコロ「Dice Empire」レビュー
http://gigazine.net/news/20150313-dice-empire/
ボードゲームの展示イベント「ゲームマーケット」の成長記録からこれからの
市場に必要なことを妄想してみた。6年間の来場者数推移(2016年4月時点調べ)
https://bodoge.hoobby.net/columns/00001
ボードゲーム市場がクラウドファンディングの出現で急成長を遂げ市場規模を拡大中
http://gigazine.net/news/20150820-board-game-crowdfunding/
実際のところ、自作ボードゲームってどれぐらい売れるもんなの?
http://roy.hatenablog.com/entry/2016/12/20/220102
ゲームマーケット2016春にて初参加サークルさんに作成数アンケートをとってきました
http://hidarigray.blog35.fc2.com/blog-entry-614.html
カフェも急増 ボードゲームにアラサーがハマる理由
http://style.nikkei.com/article/DGXMZO10921930R21C16A2000000?channel=DF260120166491
ボードゲームのオリジナルオーダー制作
http://www.logygames.com/logy/ordermade.html
0748535垢版2017/03/02(木) 19:55:15.50ID:ejFPCGdH
がっつり連続対戦中。黒番対LV2だけ流し終わった。

100局目
黒(airandom.dll)の勝利回数: 73
白(ai-lv2.dll)の勝利回数: 27

なお他のレベルも平行して回してるけどいま黒番対LV3に1勝54敗中w

なんでこんなに差がでるのかなぁ。
0749535垢版2017/03/02(木) 20:08:53.54ID:ejFPCGdH
対LV2はかなり同じパターンで勝ってるな。
勝利手順DBにずっぽり嵌ってくれてる感じだ。
LV3は嵌ってくれない。
0750535垢版2017/03/02(木) 21:41:10.44ID:ejFPCGdH
序盤用DBはそこそこうまく動いているが
中盤〜終盤用のDBのせいで致命的に打ち手が狂ってるように見える。
LV3に勝てないのは多分これだな。
0751535垢版2017/03/02(木) 23:28:08.02ID:ejFPCGdH
ずいぶん昔に書いたコードにバグがあった。
ビビるくらい致命的な奴。
よく今まで動いてたな。
0752310垢版2017/03/03(金) 01:05:23.13ID:0ijSS6CX
次の1手もDCNNもなんか上手くいかないので、アルファ碁の原点に戻りました。
アルファ碁のMTCSとしての特徴は、各ノードで評価関数を動かして、そのノードに
点をつけて勝率と50%混合する事で、ノードの選択に事前に差をつけてしまう事に
あります。これによって、負けが多いけど1手だけ良い手があるルートを正しく評価
する可能性を高めていると解釈しています。

で、評価関数はオセロでは線形和で確立されているので、昔の奴をと思ったのですが、
どうせならMLPのライブラリ使ってしまえばEigenが使えるので信頼性高い上に、学習
率の最適化でモーメンタムどころかSMORMS3が使えるようになります。インプットが
とても疎なので、EigenのSparseMatrixを使って高速化を図ります。

早速作って学習させてみたところ…僕の記憶が確かなら以前のプログラムの数十倍
くらいの速度で動いています(汗。これなら100エポックくらい楽勝。

今は評価値を計算させていますが、一旦できたら、次のステップで勝率を計算させられ
ないかなぁと。ただ、評価値がある程度正確なら、勝率ではなく平均スコアでプレイアウト
しても良いのかなと思っています。
0753535垢版2017/03/04(土) 22:29:00.76ID:ZrhUKe4E
DB初期化に35秒かかる。
コンパイラを64bit版に変えると11秒になる。
なぜこんなに差が…
ちなみに囲連星本体が32bitプログラムだからコンパイラ変えられないT△T
なんとかならんか?
0754535垢版2017/03/05(日) 03:39:08.88ID:LufQ1oMY
コンパイラの問題じゃなくてライブラリを静的リンクするか動的リンクするかの違いみたいです。多分。
かなり早くなった^_^
0755535垢版2017/03/06(月) 18:17:26.36ID:XCrs8w8i
思考時間は試行回数に直結する
重いモンテカルロは一旦封印する
0756310垢版2017/03/10(金) 01:25:20.88ID:4qfAid0y
評価関数の作り直しを始めたら、計算してはやり直しの繰り返しです。
計算速度が上がったので、比較的気楽に再計算できちゃうのがいかん。

勝率の計算もしてみましたが、結果は似たようなものでした。
いずれにせよ、もう少し精度を上げたいなぁ。
0757535垢版2017/03/14(火) 22:28:17.78ID:KNe/k0R5
LV1の棋譜はDBから削除したほうがいいみたい。
いいとこどりとはいかないか。
0758535垢版2017/03/15(水) 21:45:36.14ID:gknDrLfY
囲連星のルールは囲碁と共通部分があるから囲碁AIを参考にするのが良いと思っていたが
7連を作れば勝ちというのは王様を詰ませれば勝ちという将棋のゲーム性に近いものがあるのかもしれない。
将棋AIの手法も調べてみるべきか?
0759535垢版2017/03/18(土) 23:34:35.11ID:VnDB8sqw
手書き評価関数やっぱうまくいかないな。
LV0やLV1も実は結構強かったんだな。
反省。
0760535垢版2017/03/19(日) 00:56:20.04ID:y6fifsqj
やっぱ機械学習しかない。(無限ループ)
0761535垢版2017/03/21(火) 22:23:02.18ID:xGpFrIPp
特徴量と棋譜は用意できる。
棋譜の勝者の着手に対してどの特徴量が優先的に選択されたか?を計算したい。
どうすればいいかな?
0762名前は開発中のものです。垢版2017/03/22(水) 00:39:02.37ID:/GDSNvuJ
優先的とか無いでしょ
評価関数は全ての特徴量に対応する評価点を合計するだけ
その各評価点の絶対値が大きくて評価値に割と大きな影響を与えるとかゼロに近いとかはあるけど
0763310垢版2017/03/22(水) 09:25:05.89ID:sNSr7O3Z
>>761
それを統計的に処理して求めるのが線形回帰。
収束アルゴリズムは最急降下法を使用するのが普通。

特徴量あり1、無し0で特徴量並べたベクトルを食わせて、
荷重値であるウェイトを同数用意して内積計算。
出て来たスカラ値が、教師データに合うようにウェイトを収束計算させる。

出て来たウェイトが対応する各特徴量の重要度を表す。
0764535垢版2017/03/22(水) 20:48:28.79ID:rRrXmS1r
自力で線形回帰を実装するのはしんどそう。
なにかいいライブラリないですか?
>>535のMM法が動いてくれれば話は早かったのになぁ
0765535垢版2017/03/22(水) 21:25:31.00ID:rRrXmS1r
もう一度MM法トライしてみるか…
0766310垢版2017/03/23(木) 17:35:49.51ID:xjqriUpX
線形回帰というか、最急降下法自体はたいした事ないよ。
ひたすらループ回して、答えを出して、教師データとの差に比例して
ウェイトを調整するだけ。ニューラルネットになるとバックプロパゲーション
が出てくる(これも似たようなものだけど)違いがあるけど。

とりあえず実装の参考にするならこれ。
http://sealsoft.jp/thell/learning.pdf

GitHUBとかで探すとなんかあるかも。裏ワザではMLPのライブラリ落として
来て、1層の活性化関数無しの全結合層で計算させるって手もある。
0767310垢版2017/03/23(木) 17:40:46.97ID:xjqriUpX
こちらは、線形回帰の評価関数を作り直して、勝率と石差の2つ用意して、
アルファ碁っぽくMCTSに組み込んでみました。

で、テスト開始したらやたらと落ちる。
線形回帰の計算にEigen(行列パッケージ)を使用していたんだけど、こいつ
が並列処理に対応していないのが原因臭い。

というわけで、学習部分と、MCTSで使う評価関数を切り分けて、評価値を
求める時はEigenを使わないように改造中です。

果たして強くなっているのか。
0768535垢版2017/03/23(木) 20:11:41.72ID:rddo+SDA
>>766
ありがとうございます。
さらっと読んでみました。
いい感じの文章ですね。
なんとなくイメージは掴めましたが、実際実装するのは結構大変そうな気がします。
まずはMM法でやり直してみて、駄目だったら手を出してみます。
すいません。
0769310垢版2017/03/25(土) 10:29:51.08ID:8t9unId8
学習時と使用時の評価関数の切り分け。簡単にやるつもりだったのに、
バグ一杯出してデバッグで大変な事に。

デバッグが行き詰ると、気になっていた箇所を綺麗に直して手を動かし
続けたくなるんだけど、つい計算結果に影響が出てしまうところまで
手を入れてしまい、結局また再度学習しなおしです。

一応バグは解消したと思っていますが・・・
この土日に確認まで行けるか微妙。
0771535垢版2017/03/25(土) 21:50:08.29ID:S05KfsXi
特徴量、用意できるって言ったけど、いざ作ろうとすると迷うw
あれもほしい、これもほしいとなって発散してしまう。
0772310垢版2017/03/25(土) 23:15:01.53ID:8t9unId8
特徴量の選択はね・・・

実際にその特徴量を使って統計処理(線形回帰でもMLPでもDCNNでも何でも可)して
みて、結果の精度に効くものを残して、効かないもの(ウェイトがゼロになるとか、外して
も精度が変わらないとか)を外して、結果的に決まるものじゃないかと思います。

そういう意味じゃ、仮説検証でトライアンドエラーしないといかん。

オセロではBuroさんが論文書いてくれているので、皆それをベースに小修正程度で、
ほぼ同じ精度のものができちゃいますが、そういう先行者がいないゲームだと、自分で
やらないといけないので大変だと思います。

DCNNで「特徴量を自動的に決めてくれる」ってのに、皆が胸熱になったのは、そういう
事です。自分はオセロに応用しようとして、失敗して、後回しにしちゃいましたが。
0773310垢版2017/03/27(月) 01:55:55.89ID:n7C1rJ6D
アルファチックなMCTSオセロですが、とりあえず途中まで学習してテストしたところ・・・。

終局しているのに両者パスでツリーが伸びて行ってしまう(汗
何度チェックしても原因不明。ブレークポイントでチェックすると、あり得ない場所で
ボードデータが書き換わっているように見えますが…。並列探索が原因かと思い、
シングル動作にしてみましたが、それでも同じ。かなり重症です。

が、それを除くと、途中までテストした感じでは、最善手を打てている模様。
まだ序盤なのにツリー成長が尋常ではなく、終局までツリーができています。
不要な手をカットする仕組みとして、十分すぎる性能になっています。
とはいえ、勝率判定はそれほど正確ではないので、変な局面に誘導されると、
読み抜けが問題になってくるかも知れません。

もしかしたら、終局後もパスでツリーが伸びている問題は、これまでもあったけど、
終盤完全読みにしていて見えなかっただけかも知れません。
0774310垢版2017/03/28(火) 03:12:19.93ID:Cq+qEzvW
パスが伸びる原因は判明。

着手後の盤面を返す関数で、合法手じゃない着手を要求された時を
エラーにせず、元の盤面をそのまま返していたため、手が進まなくなって
いたのが原因だった。

が、そもそも合法手以外の手を渡すはずがないから、エラートラップして
いなかっただけで・・・

まだ根本原因にはたどり着けず。
0775535垢版2017/03/29(水) 21:27:24.43ID:a7v8cJOT
MM法動きました!
でも全然強くないw
特徴量が悪いのか棋譜が足りないのか…
0776310垢版2017/03/29(水) 21:53:37.26ID:4lOT7Sa+
大体バグがとれました。

Zebraの学習モードと対局。
F5-D6から10手目までは定石使用。その後40手目まで新AIで手を分析。
途中数回-2の手を打つものの、そのまま終盤まで行き、−4〜−6くらいで安定。
40手前に負け趨勢が判明(勝率30%くらいかな?)するとご乱心モード入り(汗

というわけで、Zebraレベルまで、もう少しという感じです。

評価関数を使用したプレイアウトは、重すぎる上に結果も散々で、結局のところ
以前の角評価付相手着手可能数ヒューリスティックで3手を選択し、75%20%
5%で振り分けるものを使用しています。評価関数型の方は多分softmaxで
使うexpの計算が重いと思うので、テーブル化を検討してみようかと思います。

一番の改善点は・・・。評価関数で悪いと評価された手には、プレイアウトを割り当て
ないので、とにかくツリー展開が縦深します。30秒思考で12〜14手目には、一番
読んでいる枝は終局に達しています。これで、モンテカルロの偶然がかなり減って
いる印象です。また、余計な横枝が伸びていないので、メモリーにも優しいです。

2手ほど間違えるのは、ツリー展開の初期値で与える評価値の誤差が原因と思います。
ここは、今の評価関数では、これ以上精度出せないので、何か手を考える必要あり。

あと、いくつかの定数調整かな。
0777310垢版2017/03/31(金) 20:13:06.62ID:Hurb1/nC
expの計算は重さの原因ではありませんでした。やはり単純に評価関数が重い模様。
プレイアウトはヒューリスティックのsoftmax版に変更。

ツリーの初期の評価値は、数手読む事で精度アップを図ってみましたが、3手も読む
とかなり時間がかかって、プレイアウト回数が1/10以下になってしまうので、バランス
見て2手読みにしてみましたが、これで強さが変わるのか不明。

10〜15手目で1回。35手前後で1回づつ間違えて、負けを確信したところで乱心。
試しに15手まで定石DBを使うようにしてみたところ、35手目まで引き分けで行けました。
やはり35手目で間違えて−6。むむむ。

40手までの棋譜。
F5 D6 C3 D3 C4 F4 C5 B5 B4 B3
E7 C6 B6 E6 F6 D7 C8 A6 C7 E3
F3 G4 G3 E2 H3 G5 G6 F7 E8 B7
F2 B8 D1 F1 A8 A7 A5 D8 A4 A3

35手目のA8以下を、A5 A4 E1 C1 A8 A7としていれば引分でした。
評価の順番はA8/E1/A5と、正解を3番手に予想しています。
Zebraの中盤20手読みでもE1と間違える局面で24手読みだと正解するみたいです。

実をいうと、途中で邪魔が入って放置している間に、バックグラウンド探索で1000万
プレイアウトの上限に2回達しています。強さ図る時はバックグラウンド探索を止めない
と意味ないかも。

囲碁AIの本を読んでいたら、プレイアウトの精度の検証に、プレイアウト結果盤面を
統計的に処理して、終局予想図を出す方法と、重要な手を見つけるクリティカリティと
言う概念の説明がありました。この辺使って、プレイアウトの弱点探してみます。
0778310垢版2017/04/01(土) 01:30:30.93ID:Wq4mpDtN
直すところが無くなってきたのでパラメータ調整。
たまたまだと思いますが、初めてZebraの中盤24手読みと引き分けました。

こちらの設定は、バックグラウンド探索無しの1手1分(相手も30秒考えるという想定)
定石10手まで。完全読み切りルーチンなし。

F5 D6 C3 D3 C4 F4 C5 B5 B4 B3
D7 C6 B6 E6 F6 G5 G6 E3 A5 E7
F3 G4 E2 C2 H4 H3 H6 H5 C7 D8
G3 H7 A3 A4 A6 H2 F8 F7 C1 D2
C8 E8 F2 D1 F1 B1 E1 G1 B2 A1
A2 B8 A8 B7 A7 G2 H1 H8 G7 G8

ちなみにZebra側は全てBookにあった模様で、一度も中盤探索していません。
0779535垢版2017/04/01(土) 11:28:54.33ID:Gu8vVrdS
おおーZebra越えが見えてきましたか凄い!
こっちも頑張らねば…
0780310垢版2017/04/01(土) 12:57:37.15ID:Wq4mpDtN
あ、たまたま4月1日の投稿ですが、嘘ではありませぬ(^^;
Zebraがエイプリルフールしてくれたのかも知れませんが。

今回はZebra側は、全部Book上で打っていたので、思考時間実質ゼロです。
Bookを変化させるにして、最初にZebra側がBook評価で-0.5くらいの手を選んで
くれたので、緩まずに終盤まで行ったのかも知れません。

でも、流石に思考時間1分はやり過ぎですよね。
あと、Zebraの中盤探索と勝負したいのですから、ZebraもBookを切った方が良いかな。
0781310垢版2017/04/01(土) 14:20:36.16ID:Wq4mpDtN
ZebraをBook無しにして対戦したら、中盤で読み勝って+2勝ちになりました。

以下棋譜。
F5 D6 C3 D3 C4 F4 C5 B3 C2 E3
D2 C6 B4 B5 F2 E6 F3 C1 A3 A4
A5 A6 A7 D1 B6 E2 E7 D7 F1 E1
A2 G1 F7 G5 G4 G6 F6 H3 E8 C8
D8 G3 B8 B7 H5 H7 G2 H1 H6 G8
B1 A1 A8 C7 G7 H4 B2 H8 H2 F8

Zebra設定:白番、中盤24手探索、Book未使用、中盤変化せず
当方設定:黒番、10手目まで引分定石使用、思考時間1分、バックグラウンド探索なし
注)昨夜評価関数の学習を少し進めました。多分誤差範囲です。

Zebraの解析によれば23手目あたりで間違えてくれたみたいです。

こちらは10手までは定石使っておかないと、かなり滅茶苦茶な手を打ってしまったり
しますので、Zebraの序盤の精度は凄いですね。

次はどうしよう。
強化学習を調べているんだけど、いまいちどう応用したら良いのかがわからない。
0782310垢版2017/04/01(土) 16:16:54.26ID:Wq4mpDtN
1分探索では申し訳ないので、10秒探索+バックグラウンド探索にしてみました。

F5 D6 C4 D3 C3 F4 C5 B3 C2 E3
D2 C6 B4 B5 F2 E6 F3 C1 A3 A4
A5 A6 A7 D1 B6 E2 F1 E1 A2 G1
E7 D7 F7 G5 G4 G6 F6 H3 E8 C8
D8 G3 B8 B7 H5 H7 G2 H1 H6 G8
B1 A1 A8 C7 G7 H4 B2 H8 H2 F8

若干違うけど、ほとんど同じような進行で+2勝ち。
確認していないけど、手順前後で同じ終局図になっている気がする。

ちなみに23手目A7は、自分の手番でした。解析結果も、Zebra側が見落とした手
を発見している形になっています。恐らく、その手前の22手目のA6辺りで見落とし
が起きているのだと思います。

こちらが間違えていないという点は評価できるけど、Zebraを中盤変化させて色々な
パターンを試す必要ありそう。

まだ半信半疑だけど、10秒探索でこれって、ものすごく強くなってる気がしてきた。
0783310垢版2017/04/01(土) 17:37:16.14ID:Wq4mpDtN
もう1局やって引分。

強化学習って、プレイアウト同士対局させながら、確率的勾配効果法で
1件づつ更新を繰り返す形で良いのかなぁ。
0784310垢版2017/04/02(日) 18:48:15.03ID:xuvwd7i8
別のオープニングを試したところ、F5F6系や、F5D6C4G5系はZebraに勝てません。

試しにF5D6C4G5系を調べてみたところ、ツリー展開がなかなか深まらない様子で、
有望と評価される分岐が多すぎるのかと思います。最後はやけになって、1分読み
+要所でバックグラウンド放置探索で無理やりツリーを伸ばしたところ、途中経過で
Zebra評価値が−4まで行ったところから何と+4まで回復しました。

やはりポイントはツリーの深さであり、余計な枝を探索しない、ポリシーネットの精度
が重要になると。多分。


あと、相手パスの時にもおかしくなるバグを発見。今夜は、ここを調査。
0785310垢版2017/04/03(月) 20:36:38.16ID:BqB2rFYT
パスがおかしくなる奴は、やはりデバッグルーチン限定で、かつ直すと本処理にも
大きな修正が必要になるので、当該デバッグ処理を削除して対処。

F5D6C4G5系をテストプレイしていてわかったのは、中盤ことごとく読みがZebraと
一致しない事。一致しないだけなら良いけど、そこがところどころ悪手になってるっぽい。
読みが一致しないと、事前に読んでいない枝で探索する事になり、浅い探索のまま
間違いが連鎖する感じ。Zebraの着手は、こちらAIが予想は評価値順で3番目以降に
なっている。

これ、ロールポリシーが決めるプレイアウト割り当ての優先順位の問題か、それとも
プレイアウトの精度の問題か、はっきりしませんが、要するに評価値が間違っている
=弱いという事ですね。

で、この2点について、もう1ステップ先に進んでみようかと思います。

プレイアウトについては、強化学習で良いヒューリスティックを作れないか検討。
ロールポリシーについては、与えている棋譜のバラつきが原因かも知れないので、
強化学習の棋譜から自動生成する事を検討。

あと、終盤40手以降はほぼ間違えないので、Solverを削除してしまいました。
また、できれば、最終的には定石も無しにしたくなって来ました。
目指せピュアMCTS。
0786310垢版2017/04/03(月) 20:41:47.20ID:BqB2rFYT
忘れていた。

>>782の22手目は、Zebraの当初予想はG4でしたが、このターンに達した時に、
A6に変わりました。そこでここで強制的にG4を打たせて続行してみましたが、
+4でこちらのAIが勝利しました。Zebraが間違えたのは、もう少し前の場所の
可能性があります。
0787310垢版2017/04/05(水) 01:14:25.59ID:4SaLkpgr
>>786
Zebraが間違えたのは14手目のB5だった模様。ここで引き分け手順から外れてます。

定石無しにしようと書いておきながら、少なくとも引分とわかっている盤面情報を活用
して、探索の省略ができないかと、あちこちに組み込んでみましたが、効果は不明。

効果がわからないというより、毎晩こつこつと評価関数のエポック数を稼いでいたところ、
どうも過学習に近い状況に陥っているみたいで、手の選択が変わってきて、むしろ、
どんどん弱くなりつつあります。むむむ。

一旦変な手を選んでしまうと、Zebraにしっぺ返しを食らって、せっかく読み貯めた
プレイアウトの大半がボツになり、短いツリーで手を選択するうちに、どんどん
間違った手を打っていく模様。結果的に勝った時は、ツリーがどんどん伸びて行く
のと対照的です。

で、結局、評価関数の良し悪しという話に逆戻りorz
評価関数から脱却するためにMCTS始めた頃が懐かしい・・・
0788535垢版2017/04/05(水) 23:08:13.71ID:laANBz/U
最新の対戦結果です。
LV2に白番で勝ち越したようです。
しかし、LV1に黒番で負け越している。
あとLV1とLV3で白番のほうが勝率がいいのが謎。
真面目に長連対策してないのが弱点になっているのだろうか?
それにしてもLV3強すぎる。
LV1との対戦も100戦やる予定でしたが途中で固まってしまったようです。

100局目
黒(airandom.dll)の勝利回数: 2
白(ai-lv3.dll)の勝利回数: 98

100局目
黒(ai-lv3.dll)の勝利回数: 92
白(airandom.dll)の勝利回数: 8

100局目
黒(airandom.dll)の勝利回数: 77
白(ai-lv2.dll)の勝利回数: 23

100局目
黒(ai-lv2.dll)の勝利回数: 45
白(airandom.dll)の勝利回数: 55

86局目
黒(airandom.dll)の勝利回数: 41
白(ai-lv1.dll)の勝利回数: 45

83局目
黒(ai-lv1.dll)の勝利回数: 7
白(airandom.dll)の勝利回数: 76
0790310垢版2017/04/08(土) 17:26:32.31ID:cxbXAKoL
色々グチャグチャと改良(改悪)してましたが、一旦整理して、結局かなりシンプルな
形に落ち着きました。定石も無しにしましたので、2手目以後は考えます。プレイアウト
に時間がかかるので、序盤は考える時間が長すぎです。点数ベースの評価関数を弄り
倒して勝率っぽい数字をでっちあげる事で、勝率の評価関数を使わなくなりました。

今のところ対Zebraは勝ったり負けたりで、強さ的には匹敵するところまで行けたかなと。
両者定石無しなので、純粋にAI部の強さ比較という事で良いのかなぁと自負。

たまにはAI白番(Zebra黒)の棋譜を。自作AIの+2勝ちです。

F5 D6 C4 D3 C3 F4 C5 B3 C2 E3
D2 C6 B4 A3 G4 F3 E6 F7 B5 A4
A6 B6 G3 F6 E7 F8 D7 C7 G6 H5
D8 C1 H6 H4 E8 C8 G5 H7 B1 A1
B2 E2 A2 H3 F1 D1 G7 H8 G8 A5
A7 F2 E1 G1 H1 B7 G2 H2 B8 A8

MCTSじゃあまり強くならないと思っていたのが、ここまで来れて正直本人がびっくり。
アルファ碁のNature論文のお蔭です。

次ステップで強化学習とか考えていたけど、まだ何からどうすれば良いのかわからない(汗
0791535垢版2017/04/09(日) 05:10:12.89ID:h/eXLfOt
相手に守りの手を強要させることが出来る有利な状態をいかに保ってゲームを進めるか。
終盤の要になりそうです。
0792310垢版2017/04/09(日) 20:11:13.36ID:3mOyIMJx
評価関数の評価値計算でmin-Maxの時にやっていたのに、今回はやっていなかった
手抜き箇所を修正し、速度アップを図りました。
プレイアウトの速度が劇的に速くなりました。

最低でも10万プレイアウト貯め無いと、変な答えを返す(だろう)という事で、最大試行
回数の手が最低プレイアウト数を超えていない時は探索延長していました。そのため
序盤で探索延長頻発していましたが、今回の改造でほぼ延長無しになりました。


あと、評価関数のステージ分割を細かくしまして、再計算を開始。

1手20秒設定でやっていますが(他にバックグラウンド探索あり)、10秒でも実用になるかなぁ。
MCTSなオセロとしては、ある程度できちゃった気がする。
0793535垢版2017/04/10(月) 22:56:16.99ID:Sai+9C2+
もしかして>>310さんのAIは世界最強クラスってことですか?
凄すぎ…
0794535垢版2017/04/10(月) 23:19:01.03ID:Sai+9C2+
完成したら論文書いてwebで公開してくださいw
おねがいしますw
0795310垢版2017/04/11(火) 07:59:39.45ID:KmgeOKfx
>>793
いや・・・それはないです。

オセロの場合、定石DBの学習が強さに直結するので、定石DBを持っていないAIは
かなり不利というか、対戦したら勝ち目ありません。何回も対戦するうちに苦手な定石
に誘導されちゃうので、勝ち目なしは確信しています。

また、アルゴリズムの優越比較という意味で、Zebraの定石DBも無しにしましたが、
Zebraの中盤も一昔前のレベルで、決して強くはないという評価をWEBで見た事が
あります。今回Zebraを使用したのは、対戦中に学習モードに切り替える事でどこで
間違えたかがわかりやすいからです。Edaxとはまだ対戦させません。

ただ、個人的に思い込みたいレベルでいうなら、MCTS系のオセロAIでは最強クラス
なんじゃないかなぁと(願望)。なにせ、いまどきオセロAIを開発している人はいないし、
ましてモンテカルロ系で試そうなんて人もいなさそうですから。言ったもの勝ち(汗


アルファ碁の論文のDeepでNeural networkではない部分を適用する事で、min-Maxで
なければ存在価値がないところまで行き着いていたオセロAIでもMCTSで結構強くなれる
事が証明できたかなぁと。本当にアルファ碁様様です。

ブログ作って解説でも作ろうかと準備していましたが、試しに開設したブログサービスでは
アップロードができなかったので、一旦閉鎖しました。どこか良いところないかな。
0796535垢版2017/04/13(木) 22:33:44.03ID:vVAZxoH8
いろいろ試してみてるけどなんか勝利手順DBを充実させるのが一番手っ取り早く強くなる気がする。
いま12万局分棋譜あるけど100万局くらいまで増やしてみるか…
もっと計算リソースが欲しい。
0797310垢版2017/04/18(火) 01:24:07.08ID:Ohai0OaC
評価関数のエポックを更に進めたら180エポック近辺から勝てなくなってきました。
もしかしてたまたま間違ったところが、zebraの弱点をついていたのかも知れないし、
評価関数の値にメリハリがついてきて、逆に見落としが起きやすくなったのかも
知れないし。過学習かも知れないし。

評価関数をブラッシュアップするには、負け手順を棋譜化して、学習データに投入
しなきゃならん。

ところが、負け確定後に例の自爆モードが作動してしまいます。棋譜として使えるよう
にするために、ソルバーを復活させました。ついでに色々やってたら、見なかった事
にしていたバグもとれました。ついでだからと偶数理論を実装したのですが、かえって
遅くなってしまった。他の人はどういう実装しているのだろう。

今の速度だと35手目から読み切らないといけない。今の速度だと時間の予測が難し
いというか、軽く1時間はかかりそう。
0798535垢版2017/04/19(水) 21:59:17.68ID:WjbK3YLE
Ponanzaがディープラーニング取り込みに成功したとかなんとか。
ハードもものすごいものを用意するそうですね。
0799535垢版2017/04/21(金) 20:55:54.67ID:ZLYvyeQY
大分勝率上がってきた。
思考時間長いから数こなせないのが厳しいですね。

25局目
黒(airandom.dll)の勝利回数: 8
白(ai-lv3.dll)の勝利回数: 17
0800535垢版2017/04/21(金) 22:05:48.97ID:ZLYvyeQY
やっぱディープラーニング憧れるなぁ。
俺のAIにもブレークスルーを起こしてくれw
0801310垢版2017/04/23(日) 20:02:43.30ID:Kquj3Rxt
色々係数調整したらめっちゃ弱くなって焦ってあちこちいじってました。
最初の調整の方向が逆だった模様で、反対に振ったら少し良くなりました。

過学習っぽい問題を何とかしたくて、ポリシーネットが作れないか、もう一度挑戦してます。
線形Softmaxでまた色々やっていたのですが、今まで上手く行かなかった理由が判明。
特徴を圧縮するのに…反転させたり回転させたりしていたので、盤面位置がわからなく
なった投入データに対して、盤面との対応ができてる教師データと整合性が取れなく
なっていたと…いまさら気づきまして…学習部分を全面的に作り直しとなっています。
なんて馬鹿な事をしていたんでしょう(涙

つまり、これが原因だったら、MLPも使えるかもって事です。
流石にDCNNは関係ないですが。
0802535垢版2017/04/24(月) 23:38:10.10ID:Jt3D6fnV
もう一回connect4に立ち返ってみるかな…
気分を変える意味でも…
0803535垢版2017/04/25(火) 21:31:44.16ID:I7r6uvd5
あ〜なんか新しいことすんの億劫だな。
プログラミングは少し充電期間をおいて本でも読もうかな。
0805310垢版2017/04/27(木) 22:32:29.06ID:gagL5fDM
億劫な時ありますね。アイデアが枯渇した時とか、陥りがちです。
しばらく放置するとアイデアが出て来たりします。


さて、線形Softmaxなポリシーネットですが、色々やって何とか計算開始しました。

回転同形の処理を真面目にやったらメモリーパンクでスワップしてしまってボツ。
仕方がないので、エポック事に回転同形をランダムに作る事に。

計算にものすごい時間がかかるので、ミニバッチサイズをミニとはとても言えない
ほどでかくして時短。お蔭で6時間越え→50分程度になりました。もっとでかくすると
更に時短できるかな。

序盤の盤面は重複が多く、学習に悪影響がありそうなので、%指定してカット。
(そのうち、同一盤面同一次着手は1件に集約しようかと思っています。)

こんな感じで現在2エポック目ですが、57%くらいの一致率という極めて優秀な成果が
出てきています。

それでも着手不能箇所が確率1位になっちゃったりするので、使用時に着手可能位置
のみ計算するようにしました。これで多少は一致率が上がるはず。
0806310垢版2017/04/27(木) 22:33:06.57ID:gagL5fDM
藤井4段凄いですね。
コンピュータ将棋で鍛えたからかな。
なんか新しい手を打ってるみたいですね。
0808535垢版2017/04/29(土) 00:08:17.53ID:knMl9lYg
ニューラルネットワーク自作入門という本を買ってきました。
平易に書こうとしてるのが伝わってくる本ですね。
平易に書くの最近の流行りなんですかね?
0809310垢版2017/05/03(水) 15:03:32.93ID:v36x8qrF
最近はもっぱらポリシーとバリューの両評価関数のテストです。

ポリシーの方は線形ソフトマックスで大丈夫そう。大体50%の正答率になります。
MLP版もコーディングはしてますが、まだテストまで至っていません。

バリューの方は、ステージ分割なしのMLP版を試してます。
計算に時間がかかりすぎて調整が進みません(汗


頭の片隅には、いつかはDCNNというのが残っています。
以前やった時に、畳み込みフィルタ演算の展開形を考えた事あります。
その時は、汎用性が無いという理由で、あまり乗り気じゃなかったのですが、
今となっては、そのまま進めればよかったかなと思う次第。
0811310垢版2017/05/05(金) 01:52:31.91ID:Orwfb9MI
世界コンピュータ将棋選手権ですね。
8勝1敗同率で、elmoに直接対決で負けた関係で予選2位通過みたいですね。

将棋は電王戦くらいしか見てなかったので、マシン制限があると思ったら、
こっちは凄いですね。CPU1092(Xeon)にGPU128基ですか…。
やっぱディープラーニングすると、それなりのマシンパワーがいるのよね。
しかも最速マシンは20億NPSとか言っているみたい(笑うしかない)。
0812310垢版2017/05/05(金) 02:46:05.76ID:Orwfb9MI
で、Ponanza Chainerに対する半可通っぽい疑問。

アピール文章読んだけど、ディープラーニングは評価関数ではなく、
ポリシーネットに相当する次の1手導出に使われているっぽい。
何故バリューじゃなくてポリシーなのか?

で、αβ系探索でポリシーとなるとオーダリングに使うくらいしか思いつかない。
将棋ってオーダリングに良いヒューリスティックスないのかな?
YBWCのPV決定だと縦に並んじゃうから、並列にする意味がない。
確率の高い手は次の段でPVの数を増やしたりするのかな?
0813名前は開発中のものです。垢版2017/05/05(金) 08:17:59.66ID:cViTmSg9
将棋(やチェス)だとYBWCよりもLazy SMPが流行ってるみたいですね
Ponanza Chainerはそれのクラスタ版のeXtreme Lazy Smpらしいですが。
0814310垢版2017/05/05(金) 08:31:32.47ID:Orwfb9MI
>>813
どうもです。早速見てみました。

自分のPCは2コアの擬似4コアなので恩恵なさそうです(汗

つか、並列化についてはPPLにお任せしちゃってるので、あまり要点が
わかっていないかも。

しかし、GPS将棋のクラスタすげーと思っていた時代は、一瞬で過去の
ものになってしまったのですねぇ。
0815310垢版2017/05/05(金) 17:24:07.29ID:Orwfb9MI
elmo優勝でPonanzaが2位みたいですね。
なんか、将棋も強くなるスピードが尋常じゃない感じ。

目標設定して(前年比9割勝利とか)、マシンパワーとか確実性が
ある所にも、資源を振り向けて達成しているみたいにも見えますが。
0816名前は開発中のものです。垢版2017/05/05(金) 17:48:22.87ID:hWowcZg5
ディープラーニングと将棋の相性が悪いてことだろうか?
elmoとやらは既存アルゴリズムなんですよね?
0818310垢版2017/05/05(金) 20:43:38.31ID:Orwfb9MI
>>816
自己対局で作った自作定石のDB積んでるみたいです。

ディープラーニングの使う場所は、オーダリングくらいしかなさそうなので、
実はオーバーヘッドとの兼ね合いが微妙じゃないかと疑ってます。
0819名前は開発中のものです。垢版2017/05/06(土) 09:18:07.29ID:ODpfq25G
自分もディープラーニングっぽいので将棋作ろうとしたけど
能力も価値も違う駒が複数あるから、それをどうするかで悩んで止まった
そのまま探索に掛けるわけにもいかず
ようするに駒割をどうするかわからなかった
一致率自体は普通に上げられるんだけどね
0820名前は開発中のものです。垢版2017/05/06(土) 09:20:21.30ID:bJnH/Q0z
そもそも将棋って、同種のゲームの中でAIにやらせるのは一番難しいくらいなんでしょ?
もっと簡単なゲームからやってみては。
0821310垢版2017/05/06(土) 09:41:02.64ID:eGOwqfr/
>>816
相性が悪いというより、効果を出し切れるところまで行かなかったのかも知れませんね。
Ponanzaは2位とはいえ、他の人には全部勝っているわけで、弱くなったわけではないと
思います。

elmoは予選で1敗しているので、予選時にponanzaに勝ったのまぐれかもと思っていたけど
直接対決2連勝で、決勝は全勝なので、やはりelmoの1年間での進歩が凄いかと。

1年間という時間制約の中で、レート向上の目標を200くらいとして、それを何で達成
するかと考えた時に、ディープラーニングを使わなくても同じくらいの向上はできたのかも
知れませんね。

とはいえ、今年は十分に活用しきれなかったけど、適用の仕方を煮詰める事で、来年から
はボーナスのレート向上が見込めるとか、そういう事はあるかも知れませんね。
0822535垢版2017/05/08(月) 22:06:30.07ID:bLY5QORw
ディープラーニングやり直してみました。
与えられた局面の勝率を学習させて、一手読みで打たせてみました。
局面が均衡しているときは結構いい手を返すみたいですが、
不利に傾くと全然おかしい手を打ち始めます。
学習させた棋譜に偏りがあるんだろうか?
どちらかに不利に傾いた局面も学習させるべき?
0823310垢版2017/05/08(月) 23:27:34.27ID:Byk3wJkT
悩ましいところですね。偏った棋譜を学習させるべきか、否か。

相手も弱いから、偏った棋譜になるわけで、そういう時にも問題が起きないように
探索と組み合わせるわけで。そう考えたら、そのままで良いのかも知れないし、
やってみないとわからないかも。自分的には、MCTSにおいてモンテカルロの
問題(隘路の騙し構造)に対して、先に避けるために、選択肢を偏らせるモノだと
認識していますので、拮抗している時に正しい手を返せばよいかと思っています。


自分は、Buroさんの特徴量をベースにしたMLPで評価関数作っているのだけど、
傾向としては線形回帰と変わらない印象です。与えている元データの偏りなのか、
それとも特徴量の選択の問題なのか、悩み中です。DCNNで特徴量抽出まで
やらせたいと、をもう一度試そうかなと言う機運になってます。

ただ、頭の中に、ワンチップマイコンで学習外だしというのがチラついていまして、
そこに入り込むと数か月、下手したら半年はとられるなぁと悶々中。

そうそう。アルファ碁のバリューネットの勝率ですが、割引率を考えたら…
という点に思い至りまして。普通勝率の評価関数はロクなもんじゃないのですが、
強化学習とセットなら、ありかもとちょっと思っています。
0824310垢版2017/05/15(月) 09:41:45.01ID:hagdu+z8
オライリーさんのところのディープラーニング本(Pythonで学ぶ奴)を読んでみました。
自分で実装する人には、なかなか良いです。Python知らないですが、説明だけで結構
おなか一杯になります。

オライリー本で、畳み込み演算の実装(行列に落とし込む)の良い方法がわかりました。
自分が以前やって放置した展開形よりもっと良い方法があるんですね。ちと畳み込む気
が湧いてきました。

現在MLP版のポリシーネットを学習させていますが、テストデータに対して60%越え
まで来ました。一方で入力データサイズが89万(特徴)×16万(ミニwバッチ)とか
わけわからん事になっていて、もう畳み込んでも処理量大差ないんじゃないかと思って
いたところですので、学習限界が見えたら、畳み込みに行ってみようかと思います。

あと、やっぱり強化学習ですね。既存データで学習していても埒があかない気が強くして
きました。
0825535垢版2017/05/15(月) 22:23:31.10ID:1z5ugcc4
ディープラーニング黒石を1、空点を0、白石を-1を入力として学習させたけど、
黒石かそうでないかの01データと空点かそうでないかの01データと白石かそうでないかの01のデータ
と3つに分けて食わせたほうがいいんだろうか?
0826310垢版2017/05/16(火) 09:54:31.52ID:Vk+2t4O7
>>825
問答無用で後者です。
0827535垢版2017/05/16(火) 21:15:39.88ID:3NTvf1qj
>>826
うーんそうなんですか。なんかそんな気はしましたが。。。
まあぼちぼちやりなおしてみます。
ありがとうございます。
0828535垢版2017/05/17(水) 22:57:33.27ID:2rHwBE7R
今すごくいい勝ち方した。
必勝形を意識した連続攻撃。
こういうのが毎回打てればなぁ。

(;SZ[19]
;B[jj];W[ik];B[ij];W[hk];B[jk];W[gk];B[kl];W[hi]
;B[ji];W[jm];B[kh];W[km];B[jg];W[jl];B[kf];W[li]
;B[je];W[id];B[jf];W[jd];B[jh])
0829310垢版2017/05/19(金) 20:14:05.97ID:skXdWaLK
結局、tiny_dnnでDCNNを組んでテスト開始。
ウィンドウサイズ3で、Conv7層+fullcon2層構成。
隠れ層のチャンネル数は暫定で32。
入力は自分・相手・空白・着手可能位置の64×4個。

入力データをDCNN用に展開すると、メモリーに収まりきらずに盛大にスワップ。
BITBOARDの64ビットデータ(unsigned int64)が、32ビット(float)×64個のvectorに
膨らんでしまうのが原因です。

仕方がないので、ファイルを適当なサイズごと読み込みながら、中間バッチを作って、
それを順次学習する形にしました。

で、中間の時間を計ってみたところ、1エポック分学習するのに数日という予想に。

全く非実用的です。どうしよう。
0830535垢版2017/05/19(金) 20:21:41.55ID:z5dIsNlN
310氏は今のノート捨ててデスクトップでいい奴組むべきw
0831310垢版2017/05/21(日) 16:44:31.83ID:kUdqCG8C
ちょこっと直して学習して様子を見てとかやってるうちに、学習しない時間かかると
言う酷い状況に陥りました。最初にテストで1バッチやった時は18分で35%程度の
正答率だったのに。いまでは1バッチ1時間の癖にNaNになったり、正答率3%程度に
落ち着いちゃったり。いわゆる勾配消失になってる模様です。学習進めば進むほど、
勾配消失も進むので、活性化関数をLeaky_ReLUとかにしなきゃいけないかも。

で、段々と強化学習方向に逃げはじめました。
かなり小さいDCNNで学習できるかテストするつもりで、強化学習のプログラム書き
はじめました。まあ、学習するにも、余計時間かかりそうですが。

マジで、デスクトップ欲しいです・・・
0832535垢版2017/05/24(水) 20:50:33.25ID:NHCMa7e2
中盤で攻めがつながるうち回しが欲しいなぁ。
上手く探索したらかなり枝刈出来そうな気もするが、
それは手書き評価関数を書くのと変わらん難しさという。
0833535垢版2017/05/25(木) 21:07:01.59ID:nz71uY7p
うあああああ、なんかおかしいと思ったらデータ読み込んでなかったw
全然変な手を打つと思ったらそういうことかーorz orz orz
0834535垢版2017/05/26(金) 21:03:34.78ID:B39N4gaL
バグが治ったらLV3にいい線まで迫ってきた凄い!

18局目
黒(airandom.dll)の勝利回数: 9
白(ai-lv3.dll)の勝利回数: 9

19局目
黒(ai-lv3.dll)の勝利回数: 12
白(airandom.dll)の勝利回数: 7

思考時間がめちゃくちゃ長いのが当面の課題ですね〜
0835535垢版2017/05/27(土) 01:33:58.68ID:vCz7BcHT
多分、あと二つくらい良い特徴量さえ見いだせればLV3に勝つる。
良い特徴量さえあれば!
0836310垢版2017/05/27(土) 20:17:57.81ID:TGXtrM6M
強化学習に大きく方向転換。

最初、ポリシーネットを模して学習しようとしたけど、出力がソフトマックスの時
負け側の教師データをどうするのか不安があったので、まずは普通にQ学習で
勝率を学ぶ事にしました。

ざっと作ったところでデバッグに時間がかかりまして、ようやく多分ちゃんと学習して
いるんじゃないかと思うところまで来ました。が、初期の学習をしないでランダム初期化
のまま開始してしまいましたので、学習はしているみたいだけど、実用レベルの学習
をするまで、どれくらいかかるのか、想像もつきません(汗

100回対戦して、1エポック学習するのに、大体8〜10分くらい。控えめに見て
1000万対戦としても、10万分。つまり2か月強必要です。アルファ碁は初期値を
学習した上で追加の強化学習が確か数千万対戦だから、年単位でも足りないかも(笑)

手を完全に固定(ランダム要素排除)した状態で学習により勝つ方向に遷移する事
は確認しましたが、最初の方をランダムにしたりε-greedyしたりして局面が偏らない
ようにしてから、1万対戦しても勝率が良くなる気配が無いので、まだすごく不安です。
0837310垢版2017/05/28(日) 21:36:00.20ID:354vTA35
ちょっと学習データの保管期限長くしたら100ゲーム14分になった。

あと、テストゲームで動くはずのない側(学習していない方)の手が変わったので
変だなと確認したら、バグ発見。後手番になっても、先手のAIを使用していた(汗

数万ゲーム行っていたのに、また一から学習しなおし。
どうせ適当に構成しているので、少しネットワークを簡素にしてみるかな。
0838535垢版2017/05/30(火) 22:08:02.05ID:rOaQFKPq
囲連星における将棋で言うところの詰めろと必至を計算するルーチンが欲しい。
かなり切実に。
0839310垢版2017/05/30(火) 23:20:25.76ID:rROdfu2T
バグ取りしながら、色々いじったら、バグとる前に別のバグを仕込んで・・・
と、長らくデバッグしてましたが、ようやくいじりたくなるところが収束し、バグが
とれて、学習が進むようになりました。

100ゲームプレイして学習のサイクル1回が4分弱になりましたので、
結構気持ちが楽になりました。とりあえず1週間くらい学習させてみます。

一通りできたら、ポリシーの方にもトライしてみようと思います。
0840535垢版2017/06/01(木) 22:33:27.70ID:COhqrYJ6
棋譜から詰めろと必至になったパターンを抽出してDBを作ってみようかな。
0841535垢版2017/06/02(金) 22:15:50.82ID:uf6z9S1Y
簡単に2手連打で必勝形ならば詰めろ、ということで仮組みしてみた。
どんな感じかな。

今度AMDからでるスレッドリッパーが気になってしょうがない。
0842535垢版2017/06/03(土) 00:14:49.53ID:976t+GmL
詰めろルーチンなかなかいい感じ?
石の流れが良くなった気がする。

そろそろシチョウルーチンも書かないとだな。
0843535垢版2017/06/03(土) 18:55:22.80ID:976t+GmL
現在LV3と対戦中ですがなかなかいい感じです。

13局目
黒(airandom.dll)の勝利回数: 9
白(ai-lv3.dll)の勝利回数: 4

11局目
黒(ai-lv3.dll)の勝利回数: 9
白(airandom.dll)の勝利回数: 2

白番でもうちょっと勝ちたいですねぇ
あと対戦にめちゃめちゃ時間かかるのがどうにも。
0844535垢版2017/06/04(日) 20:33:26.28ID:55DsrXcK
黒番対LV3大きく勝ち越せるかと思ったけど、その後追いつかれちゃってがっかりして対戦止めちゃいました。
もう一工夫必要ですね。
0845535垢版2017/06/05(月) 00:12:02.90ID:7uLLK55W
気を取り直してLV1,LV2と対戦中
なかなかいい感じ

19局目
黒(airandom.dll)の勝利回数: 19
白(ai-lv1.dll)の勝利回数: 0

17局目
黒(airandom.dll)の勝利回数: 16
白(ai-lv2.dll)の勝利回数: 1
0846535垢版2017/06/05(月) 19:22:25.72ID:7uLLK55W
引き続き対戦中
なかなかいい感じ

40局目
黒(airandom.dll)の勝利回数: 39
白(ai-lv1.dll)の勝利回数: 1

37局目
黒(airandom.dll)の勝利回数: 36
白(ai-lv2.dll)の勝利回数: 1
0847310垢版2017/06/05(月) 19:52:31.59ID:PVR4/NQn
強化学習にトライ中。
最初の勝敗をQ学習する方法は目に見えて学習できていそうだったのですが、
ネットワークが小さすぎたのか、比較的早い段階で飽和。ネットワークを深くして
再試行しようかと思ったのですが、せっかくなのでポリシーの学習にトライ。

しかし、Q学習と違って、学習が上手く進みません。
初期値問題かと思って、最初に教師あり学習をさせてみましたが、やはり勝率が
上がらないというか、30%近辺に落ち込んだまま浮かんでも50%くらいにしか
ならない感じ。このまま続けたら、どこかで戻ってくるのか。100対局の強化学習
で30分かかるので、どうしようかと。

Q学習の方は、比較的簡単に、対象のAIに勝てるようになっていて、世代の追加が
順調に進んでいました。ポリシーだと何故ダメなのか考えれば考えるほど、頭が
混乱してます。
0848310垢版2017/06/06(火) 20:05:14.75ID:6owNcmqA
バグ見つけた。簡単かつ破壊力があるやつ。
教師あり学習の一致率が試行回数少ないのに85%とかになっていて
おかしいとは思っていたんだけど。教師付学習も強化学習も同じバグ。
自分の盤面のところに、次の着手(要するに教師データ)を入れてた。

というわけで、教師付学習からやり直しています。
雰囲気的には、今のネットワークで一致率50%近くまで行きそうです。

あと、GitHUBでAlpha Goクローンを作っているプロジェクトを発見。
解説ページで評価関数部分を結構細かく解説してくれています。

そこで、ポリシーネットの負けた側について「学習率をマイナス」にして
学習すると書かれていて(@o@)。こんなスマートな方法があったとは
やられました。
0849535垢版2017/06/06(火) 20:11:39.11ID:7GjyRXFQ
>GitHUBでAlpha Goクローンを作っているプロジェクトを発見。

URLくだしあ
0851310垢版2017/06/06(火) 20:47:41.56ID:6owNcmqA
それだす。

一致率は45%で頭打ち。
時間かけずに一致率上げる工夫方面に転進します。
0852535垢版2017/06/06(火) 21:12:36.87ID:7GjyRXFQ
>>851
ありがとうございます。

LV1とLV2,ホントは100戦づつしたかったけど時間かかりすぎるから止めました。
でもまあ手ごたえありの結果ですねぇ。
LV1とLV2は卒業といってもいいかも。

54局目
黒(airandom.dll)の勝利回数: 51
白(ai-lv1.dll)の勝利回数: 3

60局目
黒(airandom.dll)の勝利回数: 58
白(ai-lv2.dll)の勝利回数: 2
0853535垢版2017/06/09(金) 22:02:57.35ID:N9z2bSO/
黒番対LV3で難解なコウ争いの末、辛くも勝利!
地力がついてきた!
それにしてもLV3の粘りには驚かされますね。

(;SZ[19]
;B[jj];W[ji];B[ki];W[ik];B[ii];W[jl];B[jh];W[hi]
;B[hh];W[gh];B[kk];W[gg];B[jg];W[kf];B[jf];W[je]
;B[ie];W[hj];B[id];W[hg];B[ig];W[ih];B[hf];W[ge]
;B[hh];W[ij];B[ic];W[ih];B[ke];W[ji];B[lf];W[kl]
;B[kg];W[jk];B[fg];W[lm];B[mn];W[kj];B[gf];W[lk]
;B[jd];W[mk];B[mf];W[ml];B[nm];W[nf];B[if];W[of]
;B[kf])
0854535垢版2017/06/09(金) 23:50:44.20ID:N9z2bSO/
シチョウルーチン組んでたら根本的なルール部分にバグ発見。
出現頻度は低い奴だけどまだこんなバグ残ってんのかとビビった。
0855310垢版2017/06/10(土) 16:27:27.71ID:PCeXyVVE
こちらはかなり迷走中。精度を求めるとCNN時間がかかりすぎ。

やっぱり、Buroさんの評価関数の特徴を入力にして、畳み込み演算を使用しない方向で
進めるのが吉ではないかと思い始めています。最終的にオセロAIの中で実用的な速度で
答えが出せるものでないと使い物にならないので。

Buroさん特徴型でポリシーが作れるか。
バリューに相当する勝率ネットワークを作った時、その勝率が使い物になるのか?
それらを強化学習で強化できるのか。

この辺に目標を切り替えます。

ちなみに、今のはBuroさん型評価関数の、評価値(終局時の石数差の予想)を、適当な
線形変換で−1〜1の勝敗の確率っぽい数字とみなして使用していますので、そこの
精度はよくなるのではないかと期待。
0856535垢版2017/06/10(土) 23:26:39.00ID:L+AkmAT7
思考時間短縮策を考えているんですが、
まだ強さが十分じゃないのに思考時間短縮を考えるのは悪手な気もする。
でも思考時間かかりすぎると統計とれないし悩ましい。
0857535垢版2017/06/11(日) 21:28:22.80ID:SJZps56X
やっぱハードを強化するしか…
AMDのスレッドリッパーあたり行っちゃうか?
0858310垢版2017/06/11(日) 23:00:35.72ID:8gFXyRd+
Buroさん特徴型で2層パーセプトロン型のポリシー作って学習開始。
1エポック目でテストデータに対して正答率48%超え(汗
当然ながらスピードも速い。

やっぱBuroさん凄い。
0859535垢版2017/06/12(月) 20:43:30.74ID:b/m4vK+x
序盤、いままでDBから一番勝利数の高い手を選んで打ってたけど、
それだと布石が限られちゃうからランダムで第二候補も打つようにしたら
若干勝率下がったような気がする。
まあしょうがないか。
0860535垢版2017/06/13(火) 21:33:01.28ID:Vwv80HwJ
囲碁プログラムなんかだとKGS行くとモンテカルロ350プレイアウト位でも結構強いプログラムあるんだけど、
なんでそんな少ない回数で強さを出せるのか謎すぎる。
0861535垢版2017/06/17(土) 23:55:21.58ID:RoY4moNt
あ〜アイディア湧かね〜
とりあえず LV3 vs LV3の棋譜取 回せるだけ回すか。
スレッドリッパーがあれば今の4倍速で棋譜収集できそうだが…
0862535垢版2017/06/21(水) 20:57:42.26ID:jKeRi7uh
プロファイル取ろうとするとメッチャ時間かかる。
マルチスレッドだと特に時間かかるんだろうか?
プロファイル無しなら2分もかからんのにもう30分くらい走らせてる気がする。
0863535垢版2017/06/21(水) 21:22:11.95ID:jKeRi7uh
将棋、連勝記録らしいですね。一位タイ?とかなんとか
0864310垢版2017/06/22(木) 17:10:28.77ID:nCVESNnQ
昨日の大雨が原因か、ノートパソコンがダメっぽいです。サーフェースなので、SSDの中身が取り出せるか微妙。多分アウト。

という訳で、ソース全滅を半ば覚悟してます(>_<)

しばらく立ち直れないかも。
0865535垢版2017/06/22(木) 19:16:22.69ID:1hrbCk1w
あちゃーご愁傷さまです
まあこれはあれですね
ハイスペックデスクトップを買えという
神のお告げですね
0866310垢版2017/06/22(木) 21:45:09.96ID:qlJt6F9H
bitlockとかいうセキュリティ保護状態になったのですが、そんな設定してないのです。解除には、解除コードが必要なのですが、そんなの設定してないし。ディスク初期化すれば復活するとの事なので、諦めて初期化しちゃいました。

ビットハックしまくったコードなので、再度コーディングするの面倒です。

ソース保管のためにも、別のPC買うべかなぁ。
0867535垢版2017/06/22(木) 23:51:29.79ID:OkW8ZbGj
そこはGitとか使えばいいんじゃないですかね〜
まあ公開するか金払うかしないとダメですが。
0868535垢版2017/06/23(金) 00:39:34.50ID:IGj3LUd/
SSE4.2はセーフだけどAVXはアウト。
おかしなメモリ番地を見に行って落ちてしまう。
CPUは命令に対応してるはずだが?
もしかしたら囲連星の本体の制限なんだろうか?
よくわからん。
0869535垢版2017/06/23(金) 21:17:34.43ID:IGj3LUd/
俺のAIのレベルが上がれば上がるほどLV3の水準の高さに驚かされる。
いつか絶対超えてやる
0870535垢版2017/06/25(日) 22:16:20.21ID:f6fx6Sdx
ちょっと気分を変えてConnect4やってるんですが、
棋譜から学習というのは半永久的に完全解析までにはたどり着かないような気がしてます。
やはり完全解析には超強力な前向き枝刈が必要なのかなと。
一回ちゃんとConnect4の完全解析、勉強してみようかなぁ。
0871310垢版2017/06/25(日) 22:19:41.68ID:rGuWTts8
地道にオセロライブラリ再構築中。

ビットボード回りのビットハックな処理部分は大体できて、着手までできるようになった。
ついでにちょっとだけ改良になりそうな変更を加えた。

ネットで調べていたらmobility関数は、もう少し性能アップしそうな方法があったけど、
ソースコピペではうまく動かなかったので後回し。

ところで、非常に大きな問題があります。
この数年で、多くのオセロ関係サイトが閉鎖されていまして…。
記譜データが集められなくなりました。
50万記譜計画も、EdaxのPVBOOKもアクセス不能です。

MCTSだと評価関数なしでもプレイはできるのですが、そこから記譜を
作るしかないのかなぁ。

つか、オセロやめて、いっそ囲碁に…。
0872535垢版2017/06/25(日) 22:41:07.34ID:f6fx6Sdx
おお〜囲碁ですか。
打倒Masterですよ!!
0873310垢版2017/06/26(月) 23:49:18.52ID:GJUXvwb3
藤井君凄かったね。
abemaの解説でも言ってたけど、互角のまま進行していたのに、
気が付いたら圧勝の情勢になるとか、AIチックな差し回しだよね。

じわじわとライブラリ構築中。
オセロ専用ライブラリはほぼ完成。

明日から終盤読み切り処理に取り掛かります。
0874535垢版2017/06/26(月) 23:59:45.84ID:EmG0vEj8
結局オセロですか。ちょっと残念w
まあ、結局自分の情熱が湧くものをやらないとですよね。
ライブラリほぼ完成とか流石に仕事速いですね。
0875535垢版2017/06/28(水) 00:10:44.15ID:aRb2YNw2
Connect4やってます。
自己対局棋譜を取りまくってDBを作成。
勝利数の多い手を高い確率で着手するようにします。
いま40万局棋譜集めてDBなしAIに対してDBありAIで勝率8割りくらい。
やっぱDBの効果はConnect4でも有効のようだ。
でも先手で完全ソルバに一発入るまでにはいくかどうか?
行ったら楽しいけど。
0876535垢版2017/06/28(水) 21:56:23.76ID:aRb2YNw2
DBありの勝率9割まできました。
そろそろ自己対局は一旦打ち切りかな。
完全ソルバとやらせてみよう。
0877535垢版2017/06/28(水) 22:15:10.75ID:aRb2YNw2
だめだ、5手目で間違える。
やっぱ自己対局じゃ完全解析までたどり着かないかなぁ。
0878535垢版2017/06/29(木) 23:11:55.06ID:VtwtdSs0
Connect4,対人だとなかなか強いんですが、
それでも全然勝てないってわけでもないですねぇ。
自分でプレーして一回勝ってしまった。
まだまだですね。
0880310垢版2017/07/01(土) 02:11:20.40ID:HltHgVcC
終盤探索とりあえずのところまで完成。

盤面の持ち方をちょっと変えて__mm128iにしてみた。
パスの処理を変えてみた。
これで、FFO#40で時間計測。

YBWCで1200msくらい
置換表までで、1800msくらい
negascoutまでで、2200msくらい

nodeカウントを入れると15%くらいスピードダウンする(汗
そこから逆算して、200万nps以上出てる。
まあ結構な速度になりました。

偶数理論も作ってみましたが、空白マスを連続する単位で分離するオーバーヘッド
が大きく、採用すると70万nps程度に落ちてしまう。この処理の良い方法が見つから
ないため、いまだに偶数理論は使っていません。むむむ。

現在、素のMCTSに着手してます。
これができたら、対局集めて、EigenでMLPのライブラリ作って、評価関数(仮)作成。
評価関数をもとにPUCTにアップグレードして強化学習という予定です。

まだ先は長い(汗
0881310垢版2017/07/01(土) 02:18:02.59ID:HltHgVcC
>>877
自己対局だと局所解にはまっちゃう時ありますよね。

DBの内容がわからないので、以下頓珍漢かもしれませんが。

解消法としては、開始後数手については、ランダム着手にする。
途中でε-greedyみたいに、ランダムな着手を挟む。

こういった方法で、局所解から外れたところも学習対象に入れる工夫があります。

気持悪いやり方だけど、5手目だけif分で強制的に直して修正済み自己対戦データ
を蓄えて学習するという方法もあります。
0882535垢版2017/07/01(土) 18:28:17.34ID:A/qufpQM
ランダム着手をまぜるのはいいかもしれませんね。
ありがとうございます。
アルファ碁もやってる手法なんでしたっけ?
0883535垢版2017/07/01(土) 23:24:59.13ID:A/qufpQM
局所解を避けつつ有望な局面を多く調べるというのはまさにMCTSでやってることなんじゃ?
一回駄目出し食らった案ですが、モンテカルロ木をDBに保存して無限に成長させるという案がどうしても忘れられない。
局面数が大きくなるゲームだと木が大きくなりすぎて駄目ですがConnect4なら…
0884535垢版2017/07/02(日) 00:25:04.48ID:iRJ6TibI
完全ソルバで遊んでるんですが、Connect4って思ったよりゲームバランス良いゲームなのかも。
先手が圧倒的優位かとおもってたけど、後手が完璧に打ってくるとき、
先手も正解が一手しかないという局面が結構あるんですね。
意外と奥が深い。
0885310垢版2017/07/03(月) 20:45:11.36ID:rpYi4lNg
MCTS自己対戦させながらデバッグ。そろそろバグはなくなりましたが…

勝っていると緩んで、負けているとギャンブルする癖と、お互いに緩みあっている間に
引き分けに収束してしまう事から、そのままでは記譜に使えない事を自覚中。

とはいえ、記譜を真面目にZebraで並べて見てしまうと、疑問手だらけで、そこを直したく
なって、強化学習にならなくなってしまいますね。

序盤はMCTSで探索し、残り20手で終盤探索して後半中心の評価関数をまず作る事かな。

もともと、前半の何手かはランダム着手して、オープニングの種類が偏らないようにしよう
かと思っていましたが、この調子だと、最初の40手はランダム着手にして、残り20手を
読み切りにした方が、記譜数が稼げる気がしてきました(汗
0886535垢版2017/07/03(月) 22:52:12.07ID:NTU08E7X
40手もランダムに打たせるんですか?うーん。
にわかには信じられないですが偏らないようにするためには有効なんですかね〜
0887310垢版2017/07/06(木) 23:41:11.66ID:uY9At7Gi
終盤20手の盤面集めなので、ばらけた方がよいし、ランダム着手の方が速いかなと。

とはいえ、今はMCTS5秒読み+残り20マス完全読みで記譜集めしてます。
1譜3分弱で、今のところ重複記譜なしで、700譜くらい集まったところです。

さっきまで藤井四段のabemaTVにCPUを15%くらい持っていかれていました(汗

改良したいところはあちこちありますが、とりあえずニューラルネットのライブラリに専念。
optimizerをどうやって作ったか、まったく思い出せない(汗
0888310垢版2017/07/08(土) 20:32:28.67ID:bOmPmg/w
ニューラルネットの計算でけました。たぶん。
頭が行列に切り替わるまでが憂鬱なんだよなぁ。

optimizerは計算式なぞるだけで楽勝でした。が、理解しないまま行列計算
に置き換えているので、何が何だかわからなくて、忘れちゃうんでしょうね。


続いて、tiny_dnnのstl的なインターフェースに憧れて、ミニバッチの処理
とかのインターフェースに凝りだしてしまった。

本当はレイヤー階層定義のところも凝りたかったのだけど、今のところ
MLPレベル(2層)までしかやらないと自分に言い聞かせて自粛中。

学習データは1200局くらい集まりましたが、全滅の時の完全読み切り
の手順取得処理にバグがあって、無限ループ入り。せっかくの全滅に
至る記譜が採れませんでした。無念。
0889535垢版2017/07/09(日) 21:54:20.93ID:DDYaMcZG
>モンテカルロ木をDBに保存して無限に成長させる
これやってます。
5手目は正解できるようになったようですが、まだまだ完全ソルバには勝てません。
メモリはそんな簡単に爆発しないみたいだけど、木が大きくなるにつれ速度がかなり遅くなる。
UCBの計算が遅いのだろうか?
0890310垢版2017/07/10(月) 00:58:02.21ID:NRizRRec
自分のはロールアウト関数がボトルネックなので、木が深くなると速度が上がっていき
ます。MCTSの設定も、どんどん深く行く方向で調整してます。UCBの計算は普通に
cmathのlogとかsqrtとか使ってます。


結局、今日は一日、ニューラルネットのライブラリのインターフェースをしこしこと
作って直して、してました。template使いまくりです。
まだやりたい事があるのですが、今の状況では不要だし、泥沼に入りそうなので、
いったんこの辺で。

記譜は1500超えたので、明日から終盤の評価関数作ってみる予定。
できたようなら、MCTSの探索方法を変えて、更に良い記譜を集めるか、それとも
置換表付き完全読み切りのバグを探すか。
0892535垢版2017/07/10(月) 23:09:01.53ID:Ioy9WIYD
ちなみにDBは初期曲面のプレイアウト回数が約36万回になりました。
少なそうに見えるかもだけどDBつくるのに結構時間かかってる。

囲連星にも応用したいな〜
0893535垢版2017/07/10(月) 23:24:06.47ID:Ioy9WIYD
DBの木の深さは一番深いところで37。
結構、深いところまで読んでるんじゃないでしょうか。
もちろん、途中で読んでない局面に分岐されると困ってしまうんですが…
0894535垢版2017/07/10(月) 23:38:14.93ID:Ioy9WIYD
UCBの係数をいじれば木を浅く広くにもできそう?
完全ソルバに勝つにはそっちのほうがいいかもしれないですね。
0895535垢版2017/07/11(火) 00:01:35.20ID:XEOuAfue
>>890
プロファイル取ってみました。
logとかsqrtとかはインライン展開されて?計算時間がよくわからなかったですけど多分ボトルネックじゃなさそう。
ちなみに局面と勝率を保持するクラスのコピーコンストラクタに全体の60%の時間がかかってるという
完全に意味不明のプロファイル結果が出ました。
どう解釈すればいいんですかね?
0896535垢版2017/07/11(火) 20:08:54.72ID:XEOuAfue
んーもしかしてツリーを丸っとコピーしちゃってる?
問題の個所はどこだろう?
0897535垢版2017/07/11(火) 21:20:27.73ID:XEOuAfue
え、めっちゃ早くなった?ww
我ながらこれはヒドスwwww
0898535垢版2017/07/11(火) 21:50:40.06ID:XEOuAfue
うおっ一瞬でメモリパンクしたwwww
310さんの言ったとおりだったwwwww
0899535垢版2017/07/11(火) 22:02:05.79ID:XEOuAfue
局面の合流を検知しないでベタに木を展開してんのがまずいのかなぁ。
まあモンテカルロ木DB化はこの辺が限界かなぁ。
0900535垢版2017/07/11(火) 22:31:32.07ID:XEOuAfue
本線じゃない分岐の間違いを修正するには指数的な試行回数が必要になるなこれは。
まあしょうがないか。
0901310垢版2017/07/12(水) 20:10:09.86ID:b5nvOjQF
直ったようで何より(^^/

自分は合流させてません。
合流させるメリットよりデメリットの方が大きそうだったので考える事をやめました。

モンテカルロ木DB化って、よくよく考えたらQ学習みたいなものではないかと思います。
Q学習だと全部のノードにQ値を持つので、結局全局面保持することになります。
現在Deep Q学習が主流になってるのは、Q値をディープラーニングで近似計算する
事で、全局面のQ値を保持しなくても良くするためという側面もあるかと思います。

で、Q学習だと考えるなら、時々変な手を混ぜて木をきちんと分岐させるってのが、
強化学習の肝ではないかと思います。


当方、完全読み切りのバグとり完了。
ニューラルネットのライブラリも大体できて、1900譜で40手目以後を学習してみました。
やっぱ、疎行列対応の行列パッケージでの計算は、tiny_dnnと比較して圧倒的に早い
です。

データが少ないのと、同一の記譜内からテストデータ取っているのもあるのですが、
テスト誤差は十分小さな値になるのですが、FFOの盤面を評価させると、いまいち
合っていない感じで、あまり汎化できていない感じす。もっと記譜増やします。

やっつけで作ったmcts部分をきちっとさせるのと、とりあえず持っている評価関数
で、puct化できるか、ロールアウトの後半の精度を上げられるか、検討開始です。
強化学習までまだ遠いなぁ。でも、少し背中が見えてきたかな。
0902310垢版2017/07/12(水) 20:27:07.87ID:b5nvOjQF
記譜集めですが、8手までランダム着手していたら、
9手目で白全滅という記譜が取れました(汗
0903535垢版2017/07/14(金) 21:11:11.02ID:TTQj/Kki
Connect4もひと段落ついたし囲連星もアイディア湧かないし
気分転換にライフゲーム囲碁のAIやろうかな。
0904310垢版2017/07/15(土) 02:17:52.56ID:qcpUcaKf
再帰呼出は関数オブジェクトを使うと速いというのを見つけて、あちこち試してみました。
static constな再帰関数は速くなるみたい。
クラス内でthisを参照するような類は効果が無いようです。

が…、なんか数か所おかしいような。

やっぱり、どこかでバグを仕込んでしまった模様。むむむ。
続きは明日だなぁ。
0905535垢版2017/07/15(土) 02:40:13.20ID:+mfEtycW
関数オブジェクトを使うと速いってのはどんな理屈なんですかね?
ちょっと想像つかない。
0906310垢版2017/07/16(日) 00:06:25.07ID:z0mkcRg4
なんかもともと関数呼び出しの方が速いという事で数字で実証するサイトがありました。
まあ、コンパイルの最適化のかかり具合なのかなぁ。わからないです。
コンパイラのバージョンで違うのかも。

バグの原因はわかりました。関数呼び出しにするときに、同時にパスの扱いを変えた
のが原因だと思います。が、確かめる際にもとに戻したら、普通の関数の方が速かった
という結果に。バグってるときの実行時間なので、あてになりませんが。

というわけで、全部もとに戻して、少しだけ確認しましたが、あまり差はない模様orz

記譜の中に間違った読み切り手順が混じってしまったので、全部再計算。
こちらもパスの扱いを変えたのが原因で、別のバグが出ました(汗
二次災害大です。

再計算は2400記譜で1時間半くらいで、着手は最善手の中でのランダムなので、
1回実行してアペンドすると倍、2回で3倍というように、記譜の増殖が可能と思い
当たりました。これを使えば学習データを簡単に増やすことができます。
0907310垢版2017/07/17(月) 22:52:41.07ID:GI+vwgP1
評価関数まわりを作ってデバッグ。
その中で致命的がバグが発覚しました。

学習用に溜めた記譜データにおかしなデータがいくつかあるというもの。
学習やり直しです。

記譜データ消した後で気が付きましたが、復旧できないわけではなかった。
後の祭りですorz
0908535垢版2017/07/19(水) 21:46:51.76ID:oWNrCACG
うヴぉあー
プログラム組むのすっごいだるい。
心ときめくアイディアが欲しいところ。
0909535垢版2017/07/20(木) 20:57:58.92ID:5PqobJjm
ライフゲーム囲碁、DB使ったほうが弱くなる?
どういうことだこれは…
0910535垢版2017/07/20(木) 21:13:01.54ID:5PqobJjm
弱くなってるわけではなく互角のよう?
DBの情報量が少なすぎるだけだろうか?
よくわからん。
0911535垢版2017/07/20(木) 21:56:32.91ID:5PqobJjm
攻め合いが全然めちゃくちゃだなぁ
5x5のパターンマッチ入れるか。
0912310垢版2017/07/22(土) 02:06:09.72ID:6HI7Rmqm
結局40手までランダム+残り20手完全読みな記譜集めて、残り20手の評価関数と
Policyを作ってます。ランダム1000件に対して30件のMCTS自己対戦混ぜたもので
学習してます。ランダムだけで十分学習になるようで、悩むより数を集める方が大事な
感じです。40手以後の評価関数ですが、30手過ぎくらいから、そこそこ使えるみたい
です。

で、これを使ってPUCTな形にしてます。

完全読みが使えないので、20〜40手あたりで最善手(に近い手順)をどうやって
作ろうかという感じです。

まずは、後ろから探索で、何手までまともな手だったか遡るプログラムを作って、
残り25手くらいまで遡れたら良いかなぁと。

つか、強化学習に行っちゃおうかなぁ。
0913310垢版2017/07/22(土) 20:32:19.70ID:6HI7Rmqm
逆順チェックのプログラムして、学習時に、正解手順で遡れる盤面も含むようにして
みました。仕組みとしては、最終盤面からヌルウィンドウサーチして、もっと良い評価に
なる手が無いことをチェックして、OKなら1手遡ります。置換表にてPVの評価は即求まる
のと、ヌルウィンドウサーチを使っているので、25手までなら楽勝です。

MCTSで対戦したデータには27手より前まで遡れるものもあるようですが、丸1日
チェックしても終わりそうにないので、25手で打ち切り処理を入れました。

記譜に正解手順で遡れる手数を持たせて、学習時には、その手番以後の盤面を使用
する事で、30手過ぎの評価の精度を上げられたら良いなぁと思います。
0914535垢版2017/07/23(日) 00:28:11.37ID:IndxNOGW
5x5のパターン入れたらむしろ弱くなってるような…
え〜なんで〜?
絶対効果あると思ったのに。
0915535垢版2017/07/23(日) 20:45:11.86ID:IndxNOGW
ライフゲーム囲碁も囲連星も完全に手詰まり。
それはそれとしてスレッドリッパーが欲しすぎる。
0916310垢版2017/07/23(日) 23:50:20.93ID:DIga1NIH
遡りチェックしていたのですが、普通のUCT時代の方が精度が高い。
そこで気合入れてPUCTのチェックをしてみたら、案の定符号がひっくり返って
いる箇所があったり、パスの処理が抜けてたり。

たぶん、これで大丈夫だと思います…。

これでしばらくは、高速化しながら、記譜集めですね。
0917535垢版2017/07/24(月) 21:00:27.54ID:+gAaelkw
もうずっと諦めてたディープラーニングに再トライするか…
0918310垢版2017/07/29(土) 22:16:52.30ID:YHqII1DK
遡りチェックの高速化で迷走中。

28手までなら問題なさそうなので、現在チェック中。
28手まで35分で遡れる記譜で29手目が1日経っても最善手か否かがわからない。
あまりに極端な差なので、何か条件があるのか、たまたまそういう記譜なのかを調べる
ために、いったん28手まで遡れる記譜を探すという段取りです。

その間、PPLのキャンセル処理について、厳密に考えていたら、今のやり方ではベータ
カットでのキャンセルが効いていないのではないかという疑念が。ループの中で再帰し
ているので、そこにcancellation_token_sourceオブジェクトを渡してやって、ポーリングを
して、下ノードでもキャンセル処理をしないといけないが、していなかったので結局中断
せずに、普通に終了待ちしてしまっているという事。
で、キャンセル処理を直したのだけど、時間変わらず。メッセージ出すようにしてデバッグ
したところ、ベータカットが1件も起きていないという謎な事態が確認されました。出てくる
答えは合っているので、しばらく考えることになります。
0919535垢版2017/08/06(日) 01:16:09.87ID:OuLT6Ytw
ここのところさぼりっぱなし
スレッドリッパーも15万以上らしいし
テンション下がる
0920310垢版2017/08/06(日) 10:08:36.68ID:zi8YR8lq
キャンセル処理については確認完了。たぶん大丈夫。
ただ、キャンセルが多発するはずの、最善手じゃなかったときに、通常より時間がかかる
傾向に見えるのが気になる。mctsが間違えるくらい枝分かれが多いからかもしれないけど。

遡りチェックはやはり遡り29手目から日単位で時間がかかるものが出てくる。
28手まで遡ると、最大数時間くらいな感じなので全部チェックするなら28手が限界かも。

当分の間、記譜集めという事になりそうですが、1日動かして数十記譜では終わる目途が立たない。
精度落とせばスピードアップできるけど。

あと、mctsで末端ノード100万単位まで探索して引き分けの時に、完全読みかけるとそう
じゃないときが結構ある。どこかで枝の探索漏れが生じてるっぽい。Policyの方はかなり
小さくても探索はかかってるようなので、Valueの方じゃないかと思う。
0921310垢版2017/08/06(日) 21:21:02.06ID:zi8YR8lq
最善手じゃなかったときの時間問題、原因判明。オーダリングでした。

オーダリングでは置換表にあるものを優先していたのですが、遡りチェックの時には
ベータカットを起こすには置換表に無い方から探索しなければいけないわけで。
遡りOKの時は、どういう順番から探索しても、全て探索するしαは更新されないので
かかる時間がほぼ一緒ですから、順番変えてOKです。

でも、これ通常探索時には逆になります。条件的には、ヌルウィンドウサーチの時と
そうじゃないときで区別できそうですが、ちょっと考えてみます。

探索の方の問題は、やはりValueの評価値とRolloutの勝率がともに悪いと、本当は勝ち
手順でも簡単にはチェックがかからなくなってしまうという問題かなと思います。この辺は
精度アップで対応するしかなさそうです。
0922310垢版2017/08/07(月) 20:08:24.65ID:3J92NhXM
オーダリングを詰めて、さらにヌルサーチ専用の処理を追加。
ベータカットが早めに起きるようにしたのもありますが、それ以外の部分でも
倍速近くなっていると思います。が、まあ、それでも28手目以前まで遡りチェック
するのに時間がかかるという点では焼け石に水。

記譜集めからの逃避はこの辺にして、記譜集めに戻らないと…。

ここまで来ると準確定石によるアルファカットも再度実装してみたい。
準確定石を求める処理も、ソースごと消失しています。
以前は盤面与えると都度再計算していましたが、石を置くごとに更新していく
ような方法にできないか考えています。とはいえ、なかなか良い方法が思い
浮かばないので、あくまで記譜集めしながら考えてみる程度ですが。
0923535垢版2017/08/07(月) 22:11:24.15ID:PWzU5nmf
うあああああ、だめだああああ
俺の才能は枯れ果てた
全然何もできない
一歩も進まない
0924310垢版2017/08/07(月) 22:15:17.79ID:3J92NhXM
がんがれー。

自分も実をいうとかなり行き詰ってるけど、やれることを少しづつやってる感じ。
まあ、一回ソース全滅したの書き直すイベントのおかげで、リセットできたってのもあるけど。
0925535垢版2017/08/11(金) 00:46:45.11ID:gdLNX0jm
スレッドリッパー遂に発売ですね。
ベンチによれば1950Xに乗り換えればCPU性能は現状の3倍以上になりそうです。
うーん欲しい。
0926310垢版2017/08/11(金) 17:12:37.06ID:3ANYT76m
自分の場合、何倍になるんだろ。単純に考えて10倍くらいになるのかなw
まあ、アムダールの法則あるから、そこまではいかないだろうけど。
メモリーも、8Gだと遡り30手あたりでスワップ始まるので、もう少しほしいなぁ。

最近、PC通販サイトを時々覗いています。
スレッドリッパーほしいですねぇ。


相変わらず遡りチェックの高速化を地味に実行中。
min-Max探索の並列処理は粒度が大きいので、待ち合わせロスが多くなりますが、
その辺を何とかしました。遡りチェックはヌルサーチにおけるベータカット検出がメイン
であるという点に依存しますので、普通の探索では使えませんが。

平行して確定石の計算作ってますが、なかなかうまくSIMD演算に落とし込めない。
しばし悩み中です。ただ、30手遡りとかまで行くと、確定石を使ったアルファカットが
かなり効きそうなので、早くなんとかしたいです。
0927535垢版2017/08/12(土) 22:58:25.64ID:BGqwTvwq
確定石という言葉で思い出しましたが
ライフゲーム囲碁にも確定石という概念がありますね
やれる事が一個見つかりました
0928310垢版2017/08/13(日) 23:11:58.30ID:icrdxDk8
確定石とりあえずできました。
自分の実装で3ステップあるうちの2ステップでSIMD化できましたが、
最後の1つはまだシフトとループの組み合わせです。

で、さっそく敵確定石数からアルファ値アンダー検出のカットロジックを
入れてみましたが、遡りチェックに入れると、途中でバグるという状態。
しばし長考が必要です。

というわけで、記譜集めに戻りましたが、こちらもランダム着手付
の探索で、稀に間違った着手をするというバグが出てます。こちら
も、しばし長考が必要かもしれません。

むむむ。
0929310垢版2017/08/14(月) 23:05:49.41ID:4KkLvd6h
記譜側のバグ取りしてました。
というか、ランダム着手部分を全面的に作り替えました。かなり簡単になりました。
が、テスト中に突然のあり得ないレベルの速度低下。
原因は、ふと並列探索にできる箇所を追加した事にありましたorz
丸一日大損です。

ついでに速度を調べていたら、ただの探索より置換表の方が遅いという恐るべき事態。
オーダリングもおかしくなっていましたので、ここも修正。

それでも、まだybwc探索と置換表探索の速度が変わらないという問題あり。

あちこちいじりすぎてわけわからなくなってます。むむむ。
0930535垢版2017/08/17(木) 18:25:09.94ID:3P8/JKah
zenおめ
0931310垢版2017/08/19(土) 00:06:36.46ID:+u+2ZNgB
なんか優勝したみたいだね。

強いAI同士で戦うと、ぎりぎりの攻防の結果、人間には穴があるように見えて
しまうのかも知れん、と、ふと思ったりして。
0932535垢版2017/08/20(日) 19:27:44.87ID:6W3WD1Mu
盆休みはまるまるさぼってしまいました。
心機一転なにか始めたいなぁ。
0933310垢版2017/08/21(月) 01:03:27.39ID:fSNFfFNF
せっかくまともに動いていた記譜集めですが、つい直したくなって直していたら
バグ出る、速度落ちるで、さんざんでした。ようやく落ち着いたかな。
キャンセルメッセージ、再帰処理だと結構混乱してしまう。

最上階層でのβカットの際、キャンセル待ちでかかっていた時間を、ほぼゼロに
短縮しました。たぶん、タイムアップのキャンセル待ちも。ただし、まだ未検証。

とはいえ、まだ記譜数が足りないのか、評価値が安定しない…
0934535垢版2017/08/22(火) 22:49:19.92ID:79INUlhM
ライフゲーム囲碁と畳み込みニューラルネットは相性良さそうなイメージが湧いてきた
ちょっと調べてみるか
0935310垢版2017/08/25(金) 00:10:43.60ID:9p5u+Oh3
スレッドリッパーいきなり値下げですね。秋冬ごろ狙おうかなぁ。

記譜集め開始したら、耐久テスト状態になってバグがちらほら。

ここ1週間くらいで直したところに原因がありました。またか。
困った事に、たまたまエラートラップに引っかからない事があるため、記譜が
全て正しいという保証が微妙な事。仕方ないので、記譜のチェックをしなきゃ
ならん…。

また、やけにおかしいと思っていた評価関数でも、問題が発覚でした。
0936535垢版2017/08/30(水) 23:19:27.29ID:o4lpiF9I
スレッドリッパー欲しいが40万円はおいそれと出せないなあ
冷静に考えると予算20万が限界だなあぶっちゃけ
畳み込みニューラルネットって何十枚もフィルター用意するんです?
計算時間メッチャかかりそうな?
0937310垢版2017/08/31(木) 22:05:50.41ID:lyHOCTEv
スレッドリッパー単体で12万円くらいですからね。
CPUクーラーと電源頑張らないといけないから、それなりの価格にはなっちゃいますね。


畳みこみは3×3を基本にしても、アルファ碁で192フィルターの12段構成とかです。
自分は今のパソコンでオセロの8×8に対して3×3の48フィルタの2段構成で試して
みましたが、学習終わる気配がないので、ペンディング中です。

普通にMNISTの手書き数字認識は、しょせんオートエンコーダの3段とかなので、大した
時間もかからずにできちゃうんですけどねぇ。例題と実践のギャップがでかすぎ。

ただ、畳み込み演算自体は昔からあるもので、たぶんFFTとかでも同じような計算して
いるはずなので、しっかり勉強すれば、何か、計算速度アップの技がありそうな気は
しています。

デバッグ考えると、ハードで頑張った方が精神的に楽ですが。
0938310垢版2017/09/03(日) 08:52:20.52ID:sEBlGL7A
相変わらず記譜集め中。

オセロの読み切り処理の並列化は、粒度がでかくて、待ち合わせロスが大きいので、
CPUがアイドルしている時間が長く気になります。そこで、スレッド数をチェックしてコア
数を下回っている時は、リーフに近いところでも並列探索に戻るようにしてみました。
PPL機能ではスレッド数は取得不可能で、結局自分で増減カウントしました。

リソースモニター上ではCPU使用率が100%近くに貼りついているいるので、待ち合わ
せロスはほぼゼロになりましたが、早くなったかどうかは未確認です(汗
0939535垢版2017/09/04(月) 20:17:25.15ID:BnaFXSEJ
畳み込みニューラルネットの勉強なかなか進みません。
とりあえず、棋譜がなければなにもできないので棋譜取始めました。
質より量優先で1局4秒くらいで生成中。
明日の夕方まで回す予定。
0940535垢版2017/09/05(火) 20:03:48.94ID:a++kwbuh
16万局分くらい棋譜集まりました。質は期待できませんが…
そろそろCNNの勉強を本格的に進めなければ。
0941310垢版2017/09/06(水) 00:21:57.37ID:lfEM6HyT
乙です。

こちとら、またまた終盤探索にバグが見つかりまして。
2日ほど根つめてデバッグ。その間記譜収集停止orz

いつも出てくれればよいのに、同じ記譜でも30回に1回とかのレベルで発現する
奴で往生しました。最終的にnull window search専用処理の置換表のどこかが
おかしいだろうというところまで追い詰めましたが、諦めました。時々異常に探索
時間がかかるのも、この処理が原因っぽかったので、やけになって削除。
すっきりしたかもw

なかなか強化学習までたどり着けない…
0942535垢版2017/09/07(木) 21:19:23.25ID:QIAny/iA
集めた棋譜を統計取ってみましたが、初手天元が妙に少ない?
という謎の現象がおきたのですが、盤面の対称性を考慮してDBを作ったせいのようです。
天元は対称局面がないが、ほかの局面は対称局面があり、対称局面は合算されるため。

ていうか16万局じゃ全然データ足りないかもw
0943535垢版2017/09/07(木) 22:01:51.18ID:QIAny/iA
初期曲面から3手目まで位しか十分な数のデータがないっぽいw
100万局にしても無駄だろうなぁ
0944310垢版2017/09/08(金) 00:27:19.31ID:4/v5wLbf
強化学習の準備始めました。
評価関数のファイル名決め打ちしてたり、staticだったりで、あちこち変えなきゃならん。

と、裏で記譜集めをしていたら、またまた問題が。
探索結果は合っているけど、逆順探索などで失敗。
用途の違う置換表を使いまわしちゃいかんという事の模様で、置換表クリアで対応。
mtd(f)で下から寄ったあと、置換表残したままもう一度上から寄せると、探索間違える
現象も確認。良く考えれば何が問題なのかわかりそうだけど、もう飽きた(汗
何回目の「これできっと大丈夫」なのかorz

>>943
局面数的には、全宇宙の原子数でも足りないかと…
特徴抽出と近似による汎化に頼らないと・・・
0945535垢版2017/09/08(金) 23:05:42.67ID:a3pCQ6U/
>>944
特徴抽出ですか…
まあCNNぼちぼち頑張ってみますが、果たして成果出るかどうかかなり怪しいですね…
0946310垢版2017/09/08(金) 23:49:16.12ID:4/v5wLbf
昨夜いろいろ考えながら寝ていたら、あっとなりまして。

今までmin-maxな部分ばかりデバッグしてましたが、最初にバグに気付いた時に
並列探索かつ置換表な時に問題が起きると気づいていたのに、見るところ間違え
てました。置換表の更新のところで、2重更新の対策してなかった(汗

null window searchとか、冤罪だったんじゃないかと。
まあ、徐々に耐久テストしてみます。
0947310垢版2017/09/11(月) 00:57:10.83ID:ieDiiY3U
>>946は潜在的には問題になりえますが、関係なかったorz

都度都度置換表をクリアしながらなら問題が起きないようです。
でも、クリアしなければならない、そもそも今のトリッキーな高速化方法では
かえって低速になる事から、着手リスト作成箇所を全面的に書き直して
しまいました。

現在耐久テスト中。今のところ調子は良さそうです。

記譜集めちんたらやりすぎなので、ちょっと質を落として数を増やしてみます。
0948310垢版2017/09/16(土) 22:09:05.96ID:4ZN/DTXg
このまま記譜集めしていても、必要分量まで集めるのにどんだけかかるかわからない
ので、悩んでいましたが、ふと思いつきました。置換表には、読み切り済の記譜が詰まっ
ていると。上限加減のタイプもあるので、全部ではありませんが、これを捨てるのは勿体
ないかなと。で、抜いてみました。25手読み事に大体3000局面の盤面と終局スコアが
得られます。

どういう局面が残るのかは、なんとも言い難いのですが、記譜の足しにはなるというか
結構な分量がたまるなぁという事で、これもとっておいて、再利用できるようにしてみま
した。置換表適用深さ分しかないので、限られてはしまいますが、分量的には結構に
なるので、利用を前提にしてみます。
0949535垢版2017/09/20(水) 22:11:12.05ID:iovYnC4+
tensorflowやってます。

import numpy as nm
winrate=nm.loadtxt("WINRATE.TXT") 
boards=nm.loadtxt("BOARD.TXT")

WINRATE.TXTは読み込めるのにBOARD.TXTは読み込めない。
データがでかすぎるってことだろうか
さてどうするか…
0950535垢版2017/09/20(水) 22:23:57.53ID:iovYnC4+
データ半分にしたら通った
まあしょうがないか
0951310垢版2017/09/21(木) 20:15:32.64ID:x7IR5Khh
tensorflowですか!
環境整備大変そうだと逃げてます。乙です。
速度感とか教えてください。

こちらは、ようやく強化学習の良い方法を考え付きまして。
とりあえずダミーとの対戦と学習部分までコーディングしてみたところ。
今夜デバッグして、強化部分のコーディングする予定。

rollout部で使用するのはあきらめました。
色々やっていたら、勝率も大事だけど、それよりツリー展開のドライバー
としての速度の方が大事だと言う結論に(汗
0952535垢版2017/09/23(土) 19:53:23.58ID:5wTLMOiz
なんか、3x3のフィルターは学習動くのに5x5のフィルターで学習させようとすると落ちる?
とりあえず、3x3のフィルターで進めてみます。
0953535垢版2017/09/23(土) 19:55:53.86ID:5wTLMOiz
tensorflow固有の問題じゃないかもですがとにかくメモリが足らんですね。
今のマシンは16GBなんですが、可能なら128GBくらい積みたい気分。
やはりスレッドリッパー欲しい。金がないけど。
0954535垢版2017/09/23(土) 22:35:13.25ID:5wTLMOiz
tensorflowに計算機占有されちゃうの意外と痛いですねorz
やはりスレッドリッパーしか…
でも金が…
0955535垢版2017/09/23(土) 22:53:28.32ID:5wTLMOiz
局面の勝率計算させてるけど今正解との誤差が平均0.14くらいっぽい
勝率で平均0.14違ったら使い物にならんじゃないのか?
うーん。
0956310垢版2017/09/24(日) 01:20:18.11ID:1rFk/uJ5
並列処理すると、何使っても計算機資源占有されちゃいますよw
だからGPUに逃がしてCPUを空けようとしたりするんですよね。

最近扇風機で冷やすようにしてますが、扇風機無しだとクロック数が80%以下まで
下がってしまって、そういう時に限って、読み切り処理でバグがあるような結果が出て
います。理屈ではありえないんだけど。

スレッドリッパーでもi-7900Xでも、CPUの温度対策は大事になると思います。
0957310垢版2017/09/24(日) 01:47:25.30ID:1rFk/uJ5
強化学習は、適当にコーディングして結果からデバッグしているので時々不安になり
ますが、それなりに学習してくれているみたい。学習内容は同じく勝率で、これをアル
ファ碁で言うところのポリシーに使用してます。

強化学習のポリシーを導入した事で、遡りチェックも調子よく遡るようになり、最善手を
指している率が上がったように感じています。しょせん強化学習だし、まだ学習しはじめ
なので、精度は高くありませんが、使い方次第ではいける感じです。

強化学習続けたら、定石DBの代わりになるんじゃないかと期待。

しばらく学習フェーズになりますが、次はロールポリシーを改良したいかな。
0958535垢版2017/09/24(日) 18:11:33.99ID:nEz2fGFF
損失がこれ以上下がらなそうなところまで来たので、
AIに組み込んでみようと思ったのですが、
tensorflowでの学習結果をどうやってC++にもってくればいいのかよくわからないというw
とりあえずググってみますが、見つかるかなぁ?
0959535垢版2017/09/24(日) 20:00:11.56ID:nEz2fGFF
C++にもってくるの現状そんな簡単じゃないっぽいorz.
0960535垢版2017/09/24(日) 23:27:13.26ID:nEz2fGFF
windows上でtensorflowをコードからビルドとかマジすか?
0961310垢版2017/09/24(日) 23:40:11.06ID:1rFk/uJ5
ウェイトデータをバイナリで持ってきて、フォワード計算を自分で書くってのじゃダメ?
パッケージに任せたい面倒くさいところって、バックワード部分だから。

自分の場合、mctsで並列処理していて、使用している行列パッケージのEigenも並列
計算していて、両方で並列化しちゃうとスレッド取り合って劇遅になっちゃうし、Eigenを
シングルスレッドで動かす時のオーバーヘッドが気になったので、AIで使用する時の
フォワード計算は自分で書きました。
0962535垢版2017/09/24(日) 23:49:44.98ID:nEz2fGFF
うーんそれが一番妥当ですかね〜
ありがとうございます。
でもバグなく書けるか若干心配w
0963310垢版2017/09/26(火) 00:08:03.06ID:TqyA8LQm
強化学習、ずっと学習続けていると、途中で弱くなっていく。
アルファ碁のやり方をまねていたけど、一旦超シンプルな方法に変えてみて、
とにかく施行回数を増やしてみます。

強化学習を使って、序盤の評価関数が作れないか検討開始。

あと、時々出ていた終盤探索のバグ。
今度はたぶん大丈夫だと思う。
何度目の大丈夫だって状態だけど(汗
0964535垢版2017/09/26(火) 00:31:24.69ID:Q8jANAxD
学習率って何気に大事なパラメータですね。
速度がかなり違う。
もっと大胆に攻めた値にすべきかな?
0965310垢版2017/09/27(水) 10:06:01.04ID:CCZHsP7K
学習率は大事だけど、今時はRMSPropとかADAMとかで
自動計算にしちゃうんじゃないの?
0966535垢版2017/09/27(水) 21:24:40.34ID:PlFiGlJN
詳しいことはよくわかりませんが、最適化の関数名はAdamOptimizerとなっているのでそうなのかもしれませんね。
学習率のパラメータ渡すところも引数省略可能っぽいですね〜
自動計算のほうがいいんだろか?。
参考にした本には学習率設定してありましたのでマネしました。
0967310垢版2017/09/29(金) 10:10:45.06ID:Cw2Mz5dw
それならAdamですね。Tensor Flowなら当たり前ですね。
学習率ってだけだったので、Optimizer無しの学習率だと思いました(汗

省略時引数はたぶんモデル発表者の提示した推奨値です。
まあ、パラメータをいじるかどうかは、個々人の好みとい事で。
0968535垢版2017/09/30(土) 19:50:26.02ID:d6qWS2yh
フィルターの数も多けりゃ多いほど誤差が減るって単純なものでもないみたいですね。
多すぎると最適化が収束しなくなるっぽい。
0969535垢版2017/09/30(土) 20:37:24.31ID:d6qWS2yh
パラメータいじりの沼にはまりそうorz
0970535垢版2017/09/30(土) 20:50:21.36ID:d6qWS2yh
メモリ!メモリが足らん!
0971310垢版2017/09/30(土) 23:21:48.52ID:WQNilA4m
フィルタ数は大きければ大きいほど良いのですが、学習に必要な時間が恐ろしく
長くなります。十分に多いフィルタ数で収束できる事を確認したうえで、だんだんと
減らして行くなんて作業になります。段数についても一緒。

ロースペックマシンだと1回試すのに下手すると数週間とかあり得るのです。
かといって、精度が出せないレベルの簡素なモデルで試しても、いつまでたって
も収束せずに、まだかなみたいな。モデルの複雑さが足りているかいないかが
わからない点が、困ったちゃんなのです。


さて、強化学習ですが、なんとなく学習しているようにも見えるし、最適解の周囲を
振動しているようにも見えます。ふと思い付いたのですが、最適化(SMORMS3って
奴を使用)をやめて、ただの学習率(もしくは、学習率の漸減)にした方が、動きが
素直になって良いのかも。

今のスピードは1時間に100万対戦。1億対戦するのに4日強かかるわけで。まだ
試行回数が足りていないかもしれないし、そもそもただの線形ではモデルが簡単すぎ
るのかもしれません。

というわけで、CNN使わずに線形でやっても同じ問題が起きまするorz
0972310垢版2017/09/30(土) 23:46:13.87ID:WQNilA4m
フィルタ数は大きければ大きいほど良いのですが、1回の学習に必要な時間が
フィルタ数に比例して長くなります。十分に多いフィルタ数で収束できる事を確認
したうえで、だんだんと減らして行くなんて作業になります。段数についても一緒。
これ、1サイクルの計算時間の話なので、収束しやすさについては、複雑さが
増すとさらに時間がかかる可能性あります。

ロースペックマシンだと収束できるか確認するのに下手すると1か月とかあり得ます。
かといって、精度が出せないレベルの簡素なモデルで試しても、いつまでたって
も収束せずに、まだかなみたいな。モデルの複雑さが足りているかいないかが
わからない点が、困ったちゃんなのです。


さて、強化学習ですが、なんとなく学習しているようにも見えるし、最適解の周囲を
振動しているようにも見えます。ふと思い付いたのですが、強化学習に限っては、
最適化(SMORMS3を使用)をやめて、ただの学習率(もしくは、学習率の漸減)に
した方が、動きが素直になって良いのかも。

今のスピードは1時間に100万対戦。1億対戦するのに4日強かかるわけで。まだ
試行回数が足りていないかもしれないし、そもそもただの線形ではモデルが簡単すぎ
るのかもしれません。

というわけで、CNN使わずに線形でやっても同じ問題が起きまするorz
0973310垢版2017/09/30(土) 23:46:51.18ID:WQNilA4m
あれ、2度書きになってしまった。
しかも内容が微妙に違うw
0974310垢版2017/10/02(月) 22:13:03.03ID:GHWiob/2
いやぁ、またやっちまった。
バリューの評価値計算が間違っているの気が付いて、リセットしようとしたら、
間違えてポリシーの強化学習の方をリセットしてしまった。またやり直しです。

ちなみに、ただの学習率ってのSGDですね。ようやく思い出した。

ついでなので、若干パラメータ変えて強化学習再開。
時間あたり試行回数は減るけど、トータルで少しは学習が速くなるはず。
0975535垢版2017/10/04(水) 21:07:28.40ID:Ls8WOlwm
CNNのフォーワード計算自前で書くの結構面倒くさいなぁ。
バグなく書けるかも心配だし。
うーん。
ここで足踏みしてます。
0976310垢版2017/10/04(水) 22:00:17.02ID:GdIdmn03
オライリー本のゼロから作るDeep Learningって本ではPythonでのコードが載ってた
けど、畳み込みのところをim2colとかいう関数で展開して、行列計算に落としこんでた。
im2colのソースを探したけど、見つからなくて放置してますが、あれが常道だと思います。
0977310垢版2017/10/05(木) 22:33:23.90ID:sIPpafz3
ポリシーの強化学習、遅々として進んでいます(汗
時々、テストでMCTS動かしてポリシーの学習値を見ているのですが、
学習対象の全48手のうち、後ろ12手分くらい、それっぽく濃淡がついてきてます。
このまま続けたら、もっと前の方まで学習してくれると期待しているのですが、ここ
からが分岐が多い箇所なので、どれくらい時間がかかるか想像がつかない。

で、ポリシーの強化学習の結果を使って、バリューの方も学習させていたのですが、
やはり無理がある事に思い至りました。バリューはバリューで別途強化学習をさせ
ないといけない模様。どちらかというとバリューの方が大事なので、このままポリシー
の学習を続けるか、一旦棚上げしてバリューの方に乗り換えるか、悩み中。

学習中のポリシーをMCTSに組み込んだところ、速度低下が著しい。メモリーのランダム
アクセスが原因だと思う。速度アップネタをいくつか模索してみたいと思いますが、
変更が重いので、いつやるかこちらも悩み中。
0978535垢版2017/10/06(金) 23:07:13.96ID:Zz+2m3w3
天頂7発売するらしいですね
これは買うしか無い
それに合わせてpcも買い換えるチャンスか?
悩ましい
0979535垢版2017/10/08(日) 00:36:58.52ID:wvFd88H+
tensorflowを捨ててC++で使いやすい別のフレームワークを探そうかと思案中
でもtensorflow捨てるの勿体ないなぁとも思う
0980535垢版2017/10/08(日) 01:13:04.86ID:wvFd88H+
ググったらtiny-dnnというのがヒットした。
ちょっと調べてみるか
0981310垢版2017/10/08(日) 01:29:43.31ID:rkcq5jaW
C++なフレームワークってほとんどないです。
自分はtiny_dnnくらいしか見つけられなかったけど、あまりに学習に時間がかかった
ので放置です。やっぱ、それなりのPC環境無いとダメなんでしょうね。

自分といえば、やっぱりバリューが大事と言う結論に。
あわせてグチャグチャになっていた強化学習回りのソースの全面整理と、mcts時の
速度改善のために、ポリシーとバリューのウェイトをセットで扱うように変更。

先ほど、ようやくまともに学習するようになったと思います。そう思いたい(汗

これでまた1週間かなぁ。
バリューは記譜使って、多少は事前学習できるけど。
0982535垢版2017/10/09(月) 22:53:42.22ID:6ifm6Vf2
tiny-dnnパッと見なかなか良さげな感じだがネットの情報だけだとよくわからん。orz.
tiny-dnnの良い入門書籍ないかな〜
0983535垢版2017/10/09(月) 23:43:40.71ID:6ifm6Vf2
うお、examplesがビルド通らね〜
めんどくせ〜
0984535垢版2017/10/09(月) 23:54:11.92ID:6ifm6Vf2
コンパイラがC++14に対応してないといかんのか?
よくわからんorz.
0985535垢版2017/10/10(火) 21:01:26.86ID:CbL+/Tjp
std::threadがないとかなんとか。
うーん。コンパイラ変えなきゃダメかなぁ?
0986535垢版2017/10/10(火) 21:28:45.95ID:CbL+/Tjp
すいません。>>310さんはtiny-dnn動かせたんですよね?
コンパイラは何使ってますか?
0987310垢版2017/10/10(火) 22:31:39.17ID:FL07aRsc
Visual Studio Communityの2017です。C++14対応してます。
GitHUBのtiny_dnnのページにC++14必須となってますね。

C++11あたりからC++がほとんど別物になっちゃったみたいですね。
自分は最近始めたばかりなので、詳しく知りませんが。
0988535垢版2017/10/10(火) 22:35:28.36ID:CbL+/Tjp
VC++ですか〜ありがとうございます。
しょうがない、乗り換えるかorz.
0989535垢版2017/10/10(火) 23:21:21.89ID:CbL+/Tjp
もしかしてインストールメッチャ時間かかる?
今日は一晩放置かな?
0990535垢版2017/10/11(水) 21:40:19.82ID:IapPKNMM
とりあえず、mnistのtest.cppはコンパイル通りました。
examplesのmain.cppは

main.cpp(305): error C2065: 'num_hidden_units': 定義されていない識別子です。

って言われた。
これからボチボチいろいろ動かしてみます。
0991535垢版2017/10/11(水) 23:13:49.39ID:IapPKNMM
そろそろスレ立ての季節ですね。
次スレどうします?
0992310垢版2017/10/13(金) 00:57:16.39ID:eAclV2CT
mnistは動かしたけど、examplesは文字通り構文サンプルとしてしか見てなかったかも。

995踏んだあたりで次スレ建てましょう。
0993535垢版2017/10/13(金) 22:13:12.16ID:XE+Je04C
>995踏んだあたりで次スレ建てましょう。

了解です。

>mnistは動かしたけど、examplesは文字通り構文サンプルとしてしか見てなかったかも。

なんかnum_hidden_unitsは定義されてるんですが定義される前に参照してるみたいですね。
順番入れ替えたらコンパイル通りました。
0994535垢版2017/10/14(土) 20:24:52.02ID:FkZ1SFjZ
tiny-dnn 懇切丁寧な入門書籍が欲しいな…
かなり良さげなのにモチベーションがなかなか高まってこないorz.
0995310垢版2017/10/15(日) 16:22:39.70ID:Y3hjOlZC
解説無いですねぇ。
まあ、わかってればわかってるなりに使えるツールみたいになってますが、
自分はウェイトデータを保存して再利用みたいなところまでたどりついていない
のですが、テンソルの構造がいまいちわかっていなかったりして。
0997310垢版2017/10/15(日) 17:01:24.30ID:Y3hjOlZC
あ、urlが2chだとNGワードになっちゃうので、5chにしてみたけど、リンクできず。

というか、どうも.scの方にスレ作ってしまったかも。
このスレもメッセージ同期していたので、気が付かなかった。

なんかわけわからん。
0999535垢版2017/10/15(日) 21:50:20.35ID:dinC5uru
スレたて乙です。
tiny-dnnの勉強全く進んでませんorz.
1000名前は開発中のものです。垢版2017/10/16(月) 19:38:44.87ID:QfTFwjlG
ぶっちゃけNNなんて、Deepが付いても大雑把じゃね?
あんなんで人間様に勝てるんかいな???
数学の回帰というのが、本質的に大雑把なんだから
10011001垢版Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 5212日 19時間 28分 26秒
10021002垢版Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況