Permalink
Fetching contributors…
Cannot retrieve contributors at this time
498 lines (360 sloc) 28.3 KB

USIプロトコルの独自拡張コマンド
■ USI options関連
・setoptionの簡略表現
> Threads 1
のように指定したとき、
> setoption name Threads value 1
と等価なようになっている。オプション名のほうは大文字小文字を無視するので
> threads 1
のように書くことも出来る。
また、
> evalshare true
のようにすべて小文字で書けるが、
> evalshare True
のように設定値に大文字を用いることは出来ない。
・set option name XXX value ...で設定できるoption項目の一覧
以下、set optionコマンドで設定できるoption項目の一覧
Threads : 思考するスレッド数
Hash : 置換表のサイズ(単位[MB])
注意) USI_Hash で設定された値は無視されます。これは将棋所で、エンジン同士を対局させるときに異なるハッシュの値に
設定することが出来ず、USI_Hashの値に従うと片側だけハッシュサイズを変更しての対局などのテストが出来なくなるためです。
この値は、長い持ち持ち時間で置換表の使用率が50%を超えるような状況であるなら、OSのメモリが
許す限り大きな値にしたほうが、探索効率が良くなり、強くなるはずです。
※ V4.83から、ここに指定する値が2のべき乗であるべきという制約がなくなりました。
※ 現状、131072(=128*1024。すなわち128GB)までしか指定してもうまく使ってくれません。
 128GB超え対応を検討中。
// config.hでUSE_HUGE_HASHをdefineしてコンパイルすれば128GB超えの置換表が使えます。デフォルトでは無効。
USI_Ponder : ponder(相手番での思考) on/off
WriteDebugLog : 標準入出力をファイル("io_log.txt")にリダイレクトする(logコマンドでonには出来る)
NetworkDelay : 通信時の平均遅延時間[ms]
これを例えば200に設定しておくと、5.0秒で指さずに、4.8秒(200ms早め)で指すようになります。
NetworkDelay2 : 通信時の最大置換時間[ms]
これを例えば600に設定しておくと秒読み10秒で、切れたら負けという瞬間に限り、9.4秒(600ms早め)に指し手を返します。
floodgateなどときどき大きな遅延が発生するサーバーで対局させるときは、この値を1200(1.2秒早め)ぐらいに設定することをお勧めします。
SlowMover : 序盤重視率[%]
切れ負けのときの思考時間を調整する。序盤重視率。百分率になっている。
例えば200を指定すると本来の最適時間の200%(2倍)思考するようになる。
対人のときに短めに設定して強制的に早指しにすることが出来る。
Contempt : 引き分けを受け入れるスコア。歩を100とする。例えば、この値を100にすると引き分けの局面は
評価値が -100とみなされる。(互角と思っている局面であるなら引き分けを選ばずに他の指し手を選ぶ)
この値のデフォルト値は2にしてある。こうすることで千日手を回避しやすくなるからである。
(1だと内部的な計算で切り捨てられてしまうので効果がない。)
ContemptFromBlack : Contemptの設定値を先手番から見た値とするオプション。Stockfishからの独自拡張。
先手のときは千日手を狙いたくなくて、後手のときは千日手を狙いたいような場合、
このオプションをオンにすれば、Contemptをそういう解釈にしてくれる。
(Contemptを常に先手から見たスコアだとみなしてくれる。)
デフォルトではfalse。
EvalDir : 評価関数用のファイルの配置フォルダ(デフォルトでは eval/ )
isreadyコマンドで評価関数ファイルを読み込むので、起動後isreadyまでにsetoptionでこの設定を変更しないと効かない。
EnteringKingRule: 入玉ルール
NoEnteringKing : 入玉ルールなし
CSARule27 : 27点法(CSAルール)
CSARule24 : 24点法。31点で宣言勝ちなので31点にならないと宣言勝ちはしない。
TryRule : トライルール
MultiPV : その局面での上位N個の候補手を調べる機能
NarrowBook : 実現確率の低い定跡を採用しない
Param1 : パラメーターの自動調整用X軸
Param2 : パラメーターの自動調整用Y軸
MinimumThinkingTime : 最小思考時間。2秒以内に指すと計測1秒となる場合、2000を指定すべき。(CSAルールなど)
このとき、NetworkDelayの分は減じて思考するので計測1秒となるはず。
MaxMovesToDraw : 終局までの手数。256手ルールなら256と設定する。0なら無制限。
BookMoves : 定跡を用いる手数(0=未使用)
PvInterval : PVの出力を抑制する。前回出力時間から、この時間(単位は[ms])経過するまでは次のPVを出力しない。
EvalShare : 評価関数を共有メモリに展開する。詳しくは解説.txtを参照のこと。
EvalSaveDir : learnコマンドを使ったときに保存するフォルダ。
BookFile 定跡ファイル : 定跡ファイルの選択
# このコンボボックスの値
no_book 定跡なし
standard_book.db 標準定跡
yaneura_book1.db やねうら大定跡(公開用 concept proof)
yaneura_book2.db 超やねうら定跡(大会用2015)
yaneura_book3.db 真やねうら定跡(大会用2016)
yaneura_book4.db 極やねうら定跡(大会用2017)
user_book1.db ユーザー定跡1
user_book2.db ユーザー定跡2
user_book3.db ユーザー定跡3
BookDir : 定跡ファイルを配置しているフォルダ
評価値ベースの定跡。以下のオプションを用いるときは
1) NarrowBookを必ずオフに。(やねうら大定跡では、「出現頻度」のところが、思考エンジンのバージョンナンバーになっています!
 このため、出現頻度順で並び替えても意味がありません。)
2) 「やねうら大定跡」「真やねうら定跡」など評価値がきちんとついている定跡を用いる。
BookEvalDiff : 定跡の第一候補手との評価値の差
定跡の指し手で1番目の候補の指し手と、2番目以降の候補の指し手との評価値の差が、
この範囲内であれば採用する。(1番目の候補の指し手しか選ばれて欲しくないときは0を指定する)
BookEvalBlackLimit : 定跡の先手の評価値下限
定跡の指し手のうち、先手のときの評価値の下限。これより評価値が低くなる指し手は選択しない。
BookEvalWhiteLimit : 定跡の後手の評価値下限
同じく後手の下限。
BookDepthLimit : 定跡のdepth下限
定跡に登録されている指し手のdepthがこれを下回るなら採用しない。0を指定するとdepth無視。
BookOnTheFly : 定跡ファイルをメモリに丸読みしない機能
やねうら大定跡のような巨大な定跡を試合開始時に読み込まれるとその読み込みに時間がかかるため、
対局中、1手指すごとにファイルを読みに行くオプション。定跡は事前にソートされている必要があります。
これはmakebook sortコマンドで行なえます。コマンドの使い方については、doc/解説.txtにある。
なお、やねうら王の公式サイトで配布している定跡ファイルはsortされています。
定跡ファイル内をバイナリサーチで調べているのでファイルサイズが10GBを超える超巨大な定跡でも取り扱えます。
ランダムアクセスに近いアクセスになるので、このオプションを用いるならHDDよりはSSDのほうが好ましいです。
ConsiderBookMoveCount : 定跡の指し手を定跡DBの採択率に比例させる(やねうら王2017Early以降)
nodestime : node as timeモード。
時間の代わりに探索ノード数を決めて探索するときのミリ秒当たりのnode数。
この値を0に設定するとnode as timeモードではない。
例) この値を600と指定した場合、
go btime 1000とすると、600000ノード(の時間が与えられたものとして)探索する。
1スレッドあたりのnps / 1000 ぐらいを指定すると、goコマンドを従来通り使える。
EngineNuma : 評価関数バイナリを共有するときのプロセッサグループの番号。
異なるプロセッサグループの評価関数と共有すると速度が低下するので異なるプロセッサグループとは
共有しないためのオプション。-1なら、指定なし。
(LOCAL_GAME_SERVER時のみ指定可能)
ResignValue : 投了スコア。例えば3000にすると相手から見た評価値が3000以上(自分から見たら-3000以下)に
なった場合に投了する。デフォルトは99999。
ConsiderationMode : "検討モード用のPV出力"
ShogiGUIなどの検討モードで用いるためのもので、このオプションをオンにすると
中途半端な読み筋が出力されることが減ります。
OutputFailLHPV : fail low/highのときにPVを出力するかどうか。ConsiderationModeでも有効。
// 協力詰めsolver時
CM_Hash : 協力詰め時の置換表サイズ(単位[MB])
// local-game-server時
EngineConfigDir : "engine_configX.txt"が配置してあるフォルダ
EngineNuma : 子プロセスでEngineを実行するプロセッサグループ(Numa node)
-1なら、指定なし。
BookSfenFile : 連続自己対戦のときに定跡の局面まで進めるためのsfenファイル。
このファイルの棋譜のまま32手目まで進める。
book/book.sfen
のように指定する。
DepthLimit : 探索深さ制限する(0 = 制限なし)
NodesLimit : 探索node数を制限する(0 = 制限なし)
→ この2つは、GUI側がgoコマンドのときにdepthとかnodeとか指定すべきような気はするが、
とりあえずGUI側がそうなっていないので用意した。
NodesLimitは正確にそのnodeで停止するわけではなく多少の誤差はある。
SkipLoadingEval : 評価関数の読み込みをskipさせる。ゼロで埋めた評価関数を用意できないときや、
新しい形式の評価関数が用意できないときに、評価関数の読み込みをskipさせるために用いる。
"test evalconvert"コマンドと組み合わせて使う。詳しくは、解説.txtのほうを参照のこと。
・getoption
使い方)
getoption [オプション名]
USI独自拡張。setoptionの逆。オプション名を指定して、その現在の値を取得する。
オプション名は大文字小文字の違いは無視する。
オプション名を省略するとすべてのオプション項目の現在の値を出力する。
■ goコマンドの拡張
go depth 6
depth指定での思考。
go nodes 10000
探索node数を指定しての思考。あまり厳密に守るわけではない。(探索ノード数をチェックする間隔が甘いので厳密に守れない)
注意)
depthとnodesは、USIプロトコルの原案となったUCIプロトコルには存在する。
将棋所は対応しておらず。ShogiGUIでは対応しているはず。
go rtime 100
とすると、今回の思考時間として、100~300[ms]を使って思考する。
自己対局でレーティングを計測するときに指し手をバラけさせる効果がある…と思って用意したが、
いまとなっては使っていない。
■ USI拡張コマンド
d : Debug デバッグ用に現在の局面を表示する。
s : Sashite 指し手生成のスピードテストを行なう。
王手がかかっているときはEVASIONS,かかっていないときはNON_EVASIONS
eval : 現在の局面に対して評価関数を呼び出して評価値を出力する。
matsuri : 指し手生成祭りの局面を現在の局面としてセットする。
moves : 現在の局面の合法手(LEGAL_ALL)をすべて出力する。
sfen : "position sfen"の略。"d"コマンドで表示されたsfen文字列をコピペするときに便利。
key : 現在の局面に対して局面のhash keyを出力
mated : 現在の局面に対して詰み判定を呼び出す。詰んでいれば1。さもなくば0。
mate1 : 現在の局面に対してmate1ply()を呼び出す。
qsearch : 現在の局面に対してLearner::qsearch()を直接呼び出して評価値と読み筋を表示する。
(デバッグ用 , EVAL_LEARNを有効にしてコンパイルした実行ファイルのみ使える。)
search : 現在の局面に対してLearner::search()を直接呼び出して評価値と読み筋を表示する。
(デバッグ用 , EVAL_LEARNを有効にしてコンパイルした実行ファイルのみ使える。)
bench : ベンチマーク
bench [置換表サイズ][スレッド数][→の指定][LimitType = depth , nodes, time][局面の指定]
例)
bench 1024 1 10 default depth
※ パラメーター省略時は上記の設定
[局面の指定]について
"default"=デフォルトの局面、"current"=現在の局面、
それ以外 = ファイル名とみなしてそのsfenファイルを読み込む
例) bench 1024 1 10 default depth
test : テスト用コマンド
実験的に実装してあるコマンドで、突然無くなることがあります。
test unit : unit test
test perft [depth] : perft(パフォーマンステスト)。深さを指定できる。
test rp [回数] : random playerのテスト。回数を指定できる。
test rpbench [回数] : ランダムプレイヤーを用いたbenchマーク。
test checks [回数] : ランダムプレイヤーで対局させて、王手の指し手生成ルーチンで指し手が
正しく生成出来ているかをテストする。
test autoplay [回数] : 思考ルーチンを呼び出して連続自己対戦をさせる。
test timeman : TimeManagerで消費する時間のテスト結果を表示する。(やねうら王classic-tce以降のみ)
test evalmerge [DIR1] [DIR2] [DIR3] [PERCENT] : DIR1の評価関数とDIR2の評価関数を
指定されたPERCENTで按分してDIR3に書き出す。(やねうら王2017Early以降のみ)
例) test evalmerge eval1 eval2 eval_out 20
このときeval1が20%、eval2が80%の新しい評価関数ファイルがeval_out/フォルダに出力される。
test evalsave : 現在の評価関数をファイルに保存。"EvalSaveDir"オプションで指定したフォルダに保存。
test evalresolve [DIR0] [DIR1] [DIR2] ...
DIR0,DIR1,DIR2,…は、評価関数フォルダ。
DIR0の評価関数が、DIR1,DIR2,…の、どの評価関数からevalmergeされているのかを調べる。
X1 DIR1 + X2 DIR2 + X3 DIR3 + ...
のような形で分解した結果を教えてくれる。
以下の記事も参考に。
・評価関数ファイルの合成、学習元を解析するツールREsolveMUtationエンジンを公開します
http://qhapaq.hatenablog.com/entry/2017/07/16/040830
・REsolve MUtationエンジンの使い方
http://qhapaq.hatenablog.com/entry/2017/07/17/001152
log : ログファイル("io_log.txt")に標準入出力を書き出す設定。Write Debug Logでon/offも出来る。
■ 定跡生成
// MAKE_BOOK_CMDをdefineしてコンパイルしたときにのみ有効。
makebook : 定跡作成コマンド。詳しくは doc/解説.txt のほうを参考に。
■ 評価関数の学習関連
・評価関数の学習で用いる教師局面の生成
// やねうら王2017Early LEARN版のみ
gensfen [depth 探索深さ] [loop 生成する棋譜の数] [output_file_name ファイル名] [eval_limit 評価値] : 学習用の自己対局棋譜の生成
例) gensfen depth 6 (残りは省略可)
eval_limitは、評価値の絶対値がこの値を上回った時点でその対局を終了するという値。
その他に指定できるオプション
write_minply N :
初期局面周辺は、類似局面ばかりなので、初期局面から数えてN手未満の局面は教師局面として書き出さない。
デフォルトでは16。
初期局面を書き出すなら、Nに1を指定する。
write_maxply N :
書き出す局面の初期局面からの手数の最大。この手数を超えると引き分け扱いとする。
デフォルトでは400。
random_move_minply,random_move_maxplyとrandom_move_countオプション
教師局面の生成時にランダムムーブを行なう最小手数と最大手数と1局でランダムムーブを行なう回数
デフォルトではrandom_move_minply = 16 , random_move_maxply = 32 , random_move_count = 5。
// 16手目から24手目までに5回のランダムムーブを行なうという意味
gensfen random_move_maxply 16 random_move_maxply 32 random_move_count 5 ...
みたいに指定する。
特殊な指定として、
random_move_minplyに-1を指定すると、
定跡を抜けるところまで定跡に従って指して、そのあと定跡局面を抜けた直後に
random_move_count回のランダムムーブを行なうという挙動になる。
random_move_like_apery N : ランダムムーブのときに玉を移動させる指し手の確率を上げる。
例えば、N = 3を指定すれば1/3の確率で玉を移動させる。
(そしてこのとき、玉を移動させたあとは1/2の確率で相手番もランダムムーブが入る。)
玉を移動させないときは普通に合法手から1手選択。(玉を移動させる指し手も含まれる)
このオプションに0を指定すると、この機能は無効化される。
random_multi_pv N : ランダムムーブの代わりにMultiPV Nでrandom_move_count手指すオプション。
ConsiderBookMoveCount = trueと組み合わせると実現確率の高い局面からスタートできるかも…。
0を指定するとこの機能は無効。
random_multi_pv_diff m : random_multipvでmulti pvで指し手を採択するときに、
1位の指し手の評価値との評価値の差がmに収まる範囲の指し手しか採択しない。
デフォルトでは32000。(範囲の限度なし)
random_multi_pv_depth : random_multipvするときの探索深さ。指定しない場合、gensfenで指定したdepth。
use_eval_hash b : 同じ局面に遭遇したときのために評価値を保存しておく機能。
これをオンにすると、hash衝突したときに間違った局面の評価値を使ってしまうため、
オフにすることを推奨。ただし、eval_limitを32000などのように大きくとる場合、
間違った評価値でもいずれは新しい局面で上書きされるため、影響は軽微であるからオンのほうが良いかも。
(オンにしないと局面の生成が2割ぐらい遅くなりかねないので)
オンにするにはuse_eval_hash 1のようにbのところに1を指定する。オフにするには0を指定する。
save_every m : ファイルの分割保存オプション。
教師局面をmだけ書き出すごとにファイルに保存する。
AWSのspot instanceのterminate対策。
mは1万の倍数を指定する。端数は無視される。
random_file_name b : 生成されるファイル名をランダム化するオプション
random_file_name 1と指定すると有効。
random_file_name 0と指定すると無効。デフォルト、無効。
このオプションが有効だとoutput_file_nameで指定したファイル名にランダムな数字を結合する。
例) output_sfen_2549869
さらにsave_everyオプションと組み合わせると
例) output_sfen_2549869 , output_sfen_2549869_1 , output_sfen_2549869_2 , ..
のように連番で保存されていく。
※ AWSで複数インスタンスを立ち上げるときに、startupのスクリプトでgensfenコマンドを叩きたいときに
それぞれのインスタンスで出力ファイル名が違っていて欲しいため。
・教師局面から評価関数の学習
learn [教師棋譜ファイル名1] [教師棋譜ファイル名2] … : 生成した棋譜から評価関数パラメーターの学習をさせる。
教師棋譜ファイル名はいくらでも書ける。
gensfenコマンドで生成したファイルを指定する。
このファイルを指定しない場合は、以下のtargetdirオプションで教師棋譜が入ったフォルダを指定する必要がある。
batオプション
learn bat 200 [ファイル名1][ファイル名2]..のように mini batchのサイズを設定できる。
200だと200万局面ごとに評価関数パラメーターの更新が行われる。
basedirオプション
learn basedir c:/kif [ファイル名1][ファイル名2]..のように指定すると c:/kif/ファイル名1 c:/kif/ファイル名2 のように
書いたのと同じ効果がある。
targetdirオプション
learn targetdir c:/kif
とするとc:/kifフォルダ内にあるファイルを根こそぎ学習対象とする。
loopオプション
learn loop 3 [ファイル名1][ファイル名2]..のように指定すると、3回ループする。
(手抜き実装のため大きな数字を指定すると、ファイル名の文字列バッファをたくさん消費するので1000ぐらいまでの指定でお願いします)
batchsizeオプション
minibatchのサイズを指定できる。デフォルトは100万局面。
eval_limitオプション
教師局面の深い探索での評価値の絶対値が、この値を超えているならその局面を読み捨てる。
指定しないときは32000が指定されているものとする。
save_only_onceオプション
評価関数を保存するときに都度フォルダを掘らないようにするフラグ。
デフォルトではオフ。
no_shuffle
読み込み時に先読みでのシャッフルを行わない。
これを指定しないときは1000万局面ごとにシャッフルしながら読み込む。
(デフォルトではオフ)
lambda elmo(WCSC27)式を内分形式にしたときのlambda。
elmo(WCSC27)と同じにするには0.33を指定すれば良い。
参考)
grad = (1 - lambda) * (eval_winrate - t) + lambda * (eval_winrate - teacher_winrate);
lambda2 , lambda_limit
深い探索の評価値の絶対値がlambda_limit以上のときは、lambdaではなくlambda2のほうを適用する。
デフォルトではlambda_limit = 32000なのでlambda2が適用されることはない。
freeze_kk bool :
freeze_kkp bool :
freeze_kpp bool :
KK,KKP,KPPのうち、KK/KKP/KPPを学習させないオプション。trueにするとその特徴因子は学習しない。
オンにするにはfreeze_kpp 1のように1を指定する。オフにするには0を指定する。
また、KKPP_KPPTのようなKKPPを持つ評価関数の場合、freeze_kkppというオプションが使える。
同様に、KPPP_KPPTのようなKPPPを持つ評価関数の場合、freeze_kpppというオプションが使える。
eta 学習率
AdaGradの学習率を設定する。30.0が標準的な学習率。
これを上げるとパラメーターの更新のときの一回の変化量が大きくなる。
(大きければ良いというわけでもない)
etaの代わりにeta1と指定しても良い。
また0を指定するとデフォルト値(30.0)になる。
etaを連続的に変化させるには、
eta1 0.01 eta2 500 eta1_epoch 100 eta3 30 eta2_epoch 500
のように指定する。
この場合、etaは0.01から始まり、epoch 100までに徐々に増加し、epoch 100で500になる。
そのあと、徐々に減り、epoch 500で30になる。そこ以降は30のまま。
eta1_epoch , eta2_epochを指定しなければこのような機能はオフになる。
たとえばeta2_epochを指定しない場合、eta3は無視される。
保存するフォルダは"EvalSaveDir"で指定したフォルダ。
デフォルトでは"evalsave"。このフォルダは事前に用意されているものとする。
このフォルダ配下にフォルダを"0/","1/",…のように自動的に掘り、そこに評価関数ファイルを保存する。
save_only_onceが指定されているときは、"0/","1/"のようなフォルダは掘らない。
・教師局面の変換
cf. http://qhapaq.hatenablog.com/entry/2017/12/25/002820
簡単な説明) 「バイナリ形式」とは、 通常の教師局面形式。
「テキスト形式」とは、テキスト(sfenと何か)で書かれた教師局面形式。
詳しい形式については、learn.cppのconvert_plain()を見ればわかる。
learn convert_bin output_file_name [出力ファイル名] [入力ファイル名1] [入力ファイル名2]
入力ファイル名1,2,…で指定されたテキスト形式の教師局面を読み込み、出力ファイル名のファイルに
バイナリ形式で出力する。
learn convert_plain output_file_name [出力ファイル名] [入力ファイル名1] [入力ファイル名2]
入力ファイル名1,2,…で指定されたバイナリ形式の教師局面を読み込み、出力ファイル名のファイルに
テキスト形式で出力する。
・教師局面のシャッフル
learn shuffle basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAME [教師棋譜ファイル名1] [教師棋譜ファイル名2] ...
basedir BASE_DIR と targetdir TARGET_DIR と output_file_name OUTPUT_FILE_NAME とは省略できる。
教師棋譜ファイル名も省略できる。教師棋譜ファイルはgensfenコマンドで生成したものとする。
shuffleしないときのコマンド同様、教師棋譜ファイルを指定しないときは、targetdirで教師局面ファイルが
入ったフォルダを指定してやる必要がある。
targetdirを省略してファイル名をそのあとに並べることも出来る。
tmp/
というフォルダに一時ファイルが書き出され、最終的に
OUTPUT_FILE_NAME
というファイルが書き出される。
output_file_name OUTPUT_FILE_NAMEを省略時には
shuffled_sfen.bin
というファイル名でカレントフォルダに書き出される。
buffer_size BUFFER_SIZE
シャッフルするときにテンポラリファイルはbuffer_size局面ずつtmp/フォルダにいったん書き出す。
例えば、buffer_size = 20000000 (20M)ならば 20M*40bytes = 800MBのバッファが必要。
メモリが少ないPCでは、ここを減らすと良いと思う。
ただし、あまりファイル数が増えるとOSの制限などから同時にopen出来なくなる。
Windowsだと1プロセス512という制約があったはずなので、ここでopen出来るのが500として、
現在の設定で500ファイル×20M = 10G = 100億局面が限度。
learn shufflem basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAME [教師棋譜ファイル名1] [教師棋譜ファイル名2] ...
メモリに丸読みしてシャッフルして指定ファイル名で書き出す。
(メモリが教師局面の2倍ぐらい必要)
その他はlearn shuffleコマンドと同様。
learn shuffleq basedir BASE_DIR targetdir TARGET_DIR output_file_name OUTPUT_FILE_NAME [教師棋譜ファイル名1] [教師棋譜ファイル名2] ...
それぞれの教師局面はファイル単位ではshuffleされていると仮定して、1passでシャッフルする。高速。
その他はlearn shuffleと同様。
複数台のPCで教師局面を生成するときに、各PCは生成直後に"learn shufflem"しているとして、
それらのファイルをホスト側で"learn shuffleq"してから学習に使うというような使い方を想定している。