DMM英会話を30000分やってみた

はじめに

3年前に「DMM英会話を6000分やっても英語は話せない話」というのを書きましたが、これの続編です。

saihyou.hatenadiary.jp

これ以降もなんとかDMM英会話を継続していて、11月のはじめに30000分を達成することができました。 ほぼ毎日約3年半くらい続けたことになります。長かった。

DMM英会話には英会話時間に応じてランクが設定されていて、30000分を達成すると最高峰のレジェンドの称号を得ることができます。 ただ残念ですが、レジェンドを取得しても何もメリットはありません。

englishfactor.jp

レジェンドを取得したということで、DMM英会話について振り返っておこうというのが今回です。

DMM英会話のレッスンの進め方

前回に書いた時から何も変更はなく、毎日デイリーニュースをやっていました。

https://eikaiwa.dmm.com/app/daily-news

毎日ニュースも更新されており、特に何か考えなくても話題が提供されるので続けるのにはとても良い教材だと思います。 毎日更新されているとはいえ、特に興味のないニュースもたくさんあるので、だいたい2~3日は同じ教材を使っていました。

講師は決まった人を作らずに、なるべく4.6以上の評価の人を予約していました。4.9以上の人は結構当たりのことが多かったです。 ただ、土日やフィリピンが休みの日には講師の人がほとんどいなくなりいい人の取り合いで大変でした。

DMM英会話を30000分続けるとどうなるのか

こんな感じで、30000分も続けると、

  • 予習しなくても困ることはない
  • 相手が話していることは集中して聞かなくても何となく理解できる
  • 話していることも何となく通じている

くらいはできるようになっており、なんとなく英語を話しているように見えます。 また、リスニング力はとても伸びました。当初は一瞬でも気を抜くと相手が何を言っているかわからなくなってしまいましたが、集中しなくても70%くらいは何を言っているのかが理解できるようになりました。 始める前は英語を話そうと思っても一切単語が出てこない状態でしたが、現在は何かしらそれっぽい単語をつなげて思うことを表現することはできるようになったかなと思います。

ただ、子供用のアニメでさえも字幕なしではほとんど意味が取れないですし、文法もかなり間違っていたり、適切な表現ではなかったりと実際の英語力はそれほど高くはなりませんでした。

オンライン英会話だけの限界

よく、オンライン英会話だけでは英語力は伸びないというのを目にしますが、実際その通りだと思います。 20000分あたりからこのまま続けても英語力は伸びなさそうだなと感じていました。 原因としては以下があげられます。

使える表現が増えない

意図してインプットを増やさない限り、語彙やフレーズ等は増えず決まった適当な表現で済ますことが多くなっていきます。 語彙はDMM英会話を漫然と続けているだけではなかなか増えないです。 これを克服するには、英会話中にこういうことを言おうとして言えなかったというようなものを記録して、 終わった後でChatGPTにどういうのが正解かを教えてもらい、それを身につくまで復習するといったようなことが必要だなと思いました。

文法力が上がらない

ある程度文法があっていれば違和感はあるけれど何となくは通じるができてしまうので、指摘されることが減ります。 このあたりは、ネイティブプランで文法を重点的に指摘してほしい等のリクエストを出すとか、 そうしなくても、気になったところをメモしておき、終わった後でChatGPTに聞くとかできると改善できそうです。

発音があまり向上しない

LとRについては、初期のころ結構指摘されるのですが、これを克服してしまうと発音について指摘されることがほぼなくなります。 これは、スタンダードプランでネイティブ以外の人が講師だからというのもありますが、ネイティブプランでネイティブにいろいろ指摘されても同じ結果になったかもと思います。 発音を伸ばすには、かなりの反復練習が必要だと感じますし、発音に集中するとフレーズとか文法とかがおざなりになるので、発音を伸ばすことのみを目的に一定期間練習しないと厳しそうだなと思っています。

おわりに

最後の方は本当にただ惰性で続けていましたが何とか30000分を達成することができました。 きちんと復習の時間を取ってオンライン英会話をやればもっと伸びたのかもしれませんが、なかなか難しいです。

DMM英会話はとても良いと思いますが、これ以上惰性でやってもどうしようもないので一旦辞めました。 現在はSpeakという英会話アプリをやっています。

app.usespeak.com

これについてもある程度やったら何か書くかもしれません。

wcsc31について

はじめに

時々ブログを書いているのですが、コンピューター将棋の大会について書いたことがなかったので、今回はちょっとまとめてみようと思います。

wcsc31について

sakuraという名前のソフトで第31回世界コンピュータ将棋選手権(wcsc31)に出場しました。

www2.computer-shogi.org

2次予選9位でn回目の決勝まであと一歩でした。 DeepLearningShogiを使っているチームの中ではトップで、DL勢の中ではPALについで2番目ということにしておきます。
// Ryfamateは合議らしいので除外です。

sakuraについて

基本的には大量の局面でベースを作って、レベルの高い棋譜で仕上げていこうと思っていました。 NNUEのdepth8で40億局面程度用意し、それを学習させベースのモデルを作成しました。 このdepth8の40億局面で学習したモデルをベースに、depth20から22の局面を2億程度使って学習させました。

結果としては、depth8は40億を用意する必要はなさそうで、もっと手早く強くなったのではという気がしています。

教師局面の生成

教師局面はほぼ全てNNUEを使用しています。 現在の将棋ソフトは十分に強いので、これを使って教師を生成したほうが手っ取り早いはずです。 ほぼこれだけで、DeepLearning勢のトップに追いついたのでNNUEで教師を作るのは悪くないと思っています。 むしろRyzen Threadripperを持っている人たちはNNUEで教師を作ったほうが良いのではと思っています。

seresnet

seresnetを使ったのはコンピューター将棋業界に伝わる「コンピューターチェスで成功したものはまず盲目的に試してみる」という格言に従ったものです。 lc0でseresnetを使っているので使ってみたというだけです。 実際にseやるのとやらないのでの比較をしていないので本当は効果がないかもしれないです。

label smoothing

これは、機械学習コンペやっているとよく出てくるやつだと思っています。

Label Smoothing - Qiita

policyの正解ラベルに(1.0 - 0.001 * NumOf合法手)、合法手に0.001で他は0としています。 これも比較実験をしていないのでわからないのですが、これはいくつかやった工夫の中で唯一効いたと思っています。 // 後で実験して結果を乗せるかもしれません。

DeepLearningShogiについて

今回はDeepLearningShogiにほぼ全面的に乗っかりました。

github.com

学習してみた感想としては、結構かんたんに強くなります。 少し前まではNNUE勢と全く勝負にもならなかったのに、ここまでのものを作った山岡さんはすごいです。

DeepLearningを使った将棋ソフト

今回の大会は電竜線でのGCTの成功に触発されたのか、それともNNUEに限界を感じたのか多くのチームがDeepLearningに乗り換えています。 事後孔明ですが、DeepLearningの将棋ソフトは現状だとNNUEと同等くらいまでしか強くならないような気がしています。 また、計算リソースがないのできちんと計測していませんが、現状だとまだNNUEが優位かなと思っています。 floodgateベースでもRTX3090のソフトが他を圧倒しているわけではないですし、A100 x 16を用意しても伸びしろはあまり大きくないと思っています。

将棋ソフトの今後

良くも悪くもやねうら王次第となっていますが、NNUEの発展は今後やねうら王とそのユーザーがどの程度頑張るかに依存しているかなと思っています。 なんだかんだ、Stockfishの最新に追随して見る人とか、学習の工夫をして見る人もいるので、次のイノベーションが見つかってDeepLearningを突き放す未来があっても不思議ではないと思っています。

DeepLearningベースについては、あとひとつ工夫をしないとNNUEに対して優位には立てないかなと思っています。 基本的には層を増やしていくとlossが明確に下がるので何も考えずによりDeepなモデルを作っていく方向性が考えられますが、 これだけでは劇的に強くするのは難しいかもという気がしています。 ただ、こちらは評価関数だけでも、入力特徴量、出力ラベル、ネットワーク構造等工夫ポイントはたくさんあると思いますので、 こちらのほうが伸びやすそうかなという気がしています。

DMM英会話を6000分やっても英語は話せない話

はじめに

ここ数年だいたいこの時期にブログを書いていたので今年もなにか書いてみようと思います。
本当ならば今年やったKaggleとかコンピュータ将棋のこととか書きたいところですが、残念ですが、今年はどちらもほとんどできませんでした。
今年の一年で最も力を入れたのがDMM英会話になってしまったので、振り返りとして、なにか書いておこうと思います。

前提

DMM英会話はゴールデンウィークくらいから開始しました。ほぼ毎日、1日25分のレッスンをやっています。
今月でだいたい6000分になりました。

f:id:saihyou:20201217113917p:plain
DMM英会話6000分
もともとの英語力としては、かなり(10年くらい)前にTOEIC 850点をとったことがあります。

なぜDMM英会話

英語を話す練習することが目的だったため、値段と評判で決めました。 相手がネイティブかどうかはどうでも良かったので、ネイティブ以外の安いプランにしています。

はじめる前に

はじめる前はやはり不安で何も話すことができなかったらどうしようと思っていました。 なので、DMM英会話をはじめる前にまずは何かを話すことができるようになろうと思いました。 どれほどTOEICの点数が高くても、アウトプットの練習をしなければびっくりするくらい英語が出てきません。 当時の会話力では、中学生レベルの文章ですら考えないと作ることができないことがわかっていたのでまずは瞬間英作文をやりました。

apps.apple.com

文法自体は知っているので、シャッフル編のアプリでだいたい10周くらいやりました。 このくらいやれば簡単な文はすぐに作れるようになってきたので準備としては良かったかなと思います。

瞬間英作文については賛否あるのかもしれませんが、中学生で習うレベルの文が即応できない人ならばやる意味はあると思います。 今の段階での個人的な感想ですが、以下の理由で、瞬間英作文をそのままやっても会話力を上げるのが難しいかなと思っています。

  • 例文が実践的ではない
  • 会話の場面で使う単語が足りない
  • 会話では日本語から英語への変換ではなく英文をすぐに思いつかないと対応できない

やりかた

最初のうちはフリートークをしていたのですが、先生によってはかなり悲惨なことになってしまいました。 そのため、2週間くらいやったあとで、DailyNewsにしました。 以降、ずっとDailyNewsをやっています。

https://eikaiwa.dmm.com/app/daily-news

とくにお気に入りの講師とかは作らずに、毎日決まった時間に評価の良さそうな人を予約しています。 一度、いつもと違う時間に予約して思いっきりすっぽかしてしまったので、それ以降、決まった時間にやるようにしています。

だいたい、やる前に簡単に予習して、質問に対してどんなことを話そうかなとか考えています。 ただ、実際には話の流れで全然役に立たないこともあります。

興味のあるトピックがなければ同じトピックを複数回やっています。 その時は、前回の受け答えで悪かったことを直したり、なるべく前回と違うことを話そうとしています。

DailyNewsの最大のメリットは会話の内容を考えなくて良いことです。 単語を読んで文章を読んで、あとはディスカッションの流れなのですが、だいたい前半の10分程度で文章を読むところまでは行きます。 なので大体15分程度英語を考えて話す練習ができます。

フリートークだと25分全部使えるのですが、続けやすさとしてDailyNewsはよくできた教材だと思います。

講師のレベル

講師の英語レベルは人によります。 人により、ほぼネイティブのごとく話す人もいれば、そうでもない人もいます。 たぶん、TOEICを受ければ、自分より点数を取れない講師もたくさんいそうです。 レベルの高い人はネイティブプランを選ぶか、他のネイティブと話せるサービスのほうがよいかもです。

いまのところのレベル感

基本的には思いついた単語を勢いでつないでいるだけです。 文法は適当です。話している途中で間違っているとわかるのですが、勢いでそのまま通しています。 適当とは言えども文法の基本的なところを外してはいないと思うので、 ある程度、講師の人に忖度してもらえばなんとか通じてはいるかなと思っています。 なにか勢いで話すことは結構大事かなと思います。

また、思いつくことを英語で伝えられなそうだなと思ったら、自分の考えとは違っても簡単に言えそうなことを話してしまいます。

はじめた頃は気を抜くと何を言っているのかわからなくなってしまいましたが、 2000分くらいからだいぶ気を抜いても話にはついていけるようになったかなと思っています。

また、4000分くらいからなんとか普通に話しているかなと言う感じになってきたと思っています。 このくらいから、聞き返すこともほとんどなくなりました。 というより、あまり聞き取れていなくても雰囲気で何かをしゃべってしまっています。

感覚ですが、会話とリスニングの能力はかなり上がったと思うので、オンライン英会話は結構良いツールだなと思っています。

ビジネスレベルと日常会話レベル

ビジネスレベルとか日常会話レベルとかそんな言葉で今のレベルを考えるとこんな感じかなと思います。

ビジネスレベルを仕事で使っても支障がないレベルというのなら、そのレベルはかなり遠いです。 外国人社員と会議で英語で議論するというのは今のレベルでは無理です。 外国人社員の英語は今でもあまり聞き取ることができません。 また、現状の文法力と語彙では、自分の考えをほとんど伝えることができていません。

日常会話レベルを日々の生活で困らないというのなら、このレベルも遠いです。 ちょっとしたことでも、結構相手に忖度してもらえなければ伝えることができず、忖度してくれない人との会話は難しいと思います。 今のレベルで英語圏で一人暮らしをするのは難しそうだなと思います。

まとめ

今の所の感想としてこんなことを思っています。

  • オンライン英会話はすごく優れたツール
  • 基本的には英語を聞いて話す練習として使うのがよさそう
  • DailyNewsは続けるのにはよい
  • 一番身についたのは適当でも何かを話し続けることかもしれない
  • ビジネスレベルや日常会話レベルに達するにはまだまだかかる

本当は今年TOEICでも受けてその結果を見せられればよいのですが、残念ながら最近のTOEICはとても人気らしいので受けていません。 来年、落ち着いた段階で挑戦してみようかなと思っています。

今年一年でやったコンペの反省

はじめに

昨年の Human Protein Atlas Image Classification | Kaggle からKaggleを初めて、 今年は、画像コンペを3つやりました。*1

やりっぱなしというのもあれなので、一応、どういうことをしたのかを残しておこうと思います。 感想文ですので、参考になることが書いてはないですが、折角ですので、アドベントカレンダーにも登録しておきます。

qiita.com

iMet Collection 2019 - FGVC6

コンペ概要

www.kaggle.com

メトロポリタン美術館に所蔵されている美術品の画像に対して、どの文化とかどういった美術品なのかという分類を推測する画像分類のコンペです。

やったこと

Model

InceptionResnetV2, Xception, InceptionV3

Data Augmentation

Affine(rotate=(-15,15)), Crop(px=(0, 16), Affine(shear=(-5, 5)), GaussianBlur(sigma=(0, 0.5)), Fliplr

Loss

focal loss

Optimization

Adam

その他

特にこれといった工夫はなく、上記のモデルの出力を平均しました。 最後に少しだけ、ラベルの少ないデータの水増しをしました。

結果

f:id:saihyou:20191208123711p:plain

Private Leader Board 68位で銅メダルでした。

反省点

よかった

このコンペの目標は銅メダルでしたので、目標を達成できました。 まずは単体のモデルでValidationデータセットで少しずつスコアを上げながら最後に複数のモデルの平均をとりました。 きちんと取り組めば、十分メダルに届くだけのことができるということがわかりました。

悪かった

ただ学習させただけで終わってしまったというのが残念でした。工夫ポイントは色々とあった気がするのですが、 それらに対して何かできるほど時間を費やすことができませんでした。 やっぱり、コンペをやるならなるべく上を目指したいなあと思いました。

APTOS 2019 Blindness Detection

コンペ概要

www.kaggle.com

網膜の眼底写真から糖尿病網膜症の重症度を判定するコンペです。 以下はいろいろな方々のまとめで、このコンペの詳細やアプローチがわかりやすくまとまっています。

Kaggle APTOS 2019 Blindness Detection まとめ - Sleep like a pillow

APTOS 2019 Blindness Detectionのまとめ - Speaker Deck

APTOS 2019 Blindness Detection 勉強会資料 - Speaker Deck

やったこと

Model

InceptionResnetV2, Xception, InceptionV3

Data Augmentation

iaa.Sequential([
    iaa.Fliplr(0.5), 
    iaa.Crop(percent=(0, 0.1)), 
    iaa.Sometimes(0.5,
                  iaa.OneOf([
                    iaa.GaussianBlur((0, 0.5)),
                    iaa.AverageBlur(k=(2, 4)),
                    iaa.MedianBlur(k=(3, 5)),
                ])
    ),
    iaa.ContrastNormalization((0.75, 1.5)),
    iaa.AdditiveGaussianNoise(loc=0, scale=(0.0, 0.05*255), per_channel=0.5),
    iaa.Multiply((0.8, 1.2), per_channel=0.2),
    iaa.Affine(
        scale={"x": (0.8, 1.2), "y": (0.8, 1.2)},
        translate_percent={"x": (-0.2, 0.2), "y": (-0.2, 0.2)},
        rotate=(-25, 25),
        shear=(-8, 8)
    )
], random_order=True)

loss

binary crossentropy

Optimization

Adam

その他

マルチラベルの分類っぽく、以下のようなラベル付けをしました。

def make_label(label):
    if label == 0:
        return np.array([0., 0., 0., 0.])
    elif label == 1:
        return np.array([1., 0., 0., 0.])
    elif label == 2:
        return np.array([1., 1., 0., 0.])
    elif label == 3:
        return np.array([1., 1., 1., 0.])
    return np.array([1., 1., 1., 1.])

一度上記のモデルで学習した結果をtestデータにラベル付けし、そのデータも使用して再度学習をした結果を採用しました。

そのほかには、EfficientNetも試してみたのですが、うまくいきませんでした。

結果

f:id:saihyou:20191214171500p:plain

Private Leader Board 309位のメダルなしでした。

反省点

よかった

コンペ終了一カ月前くらいまでは前回のコンペの学びを生かしたことができたと思います。 ただ、本当にこのコンペはダメだったことの方が多すぎました。

悪かった

コンペのラスト一カ月で何も有効なことができませんでした。 Validationは全くよくなっていないにも関わらず、Public Leader Boardだけを追求していたのがよくなかったです。

今になって思えば、もう少し、単体モデルでの精度向上に時間をかけたほうが良かったかなと思います。 コンペ終了の一ヶ月前で一旦アンサンブルまで含めた結果を作ってしまい、Publicでそれなりの順位になってしまうと、 どうしてもそこを意識してしまうので、コンペ全体でのペース配分をもう少し考えたほうがいいのかなとこれを書いていて思いました。

Understanding Clouds from Satellite Images

コンペ概要

www.kaggle.com

衛星画像から特定の雲のパターンの領域を見つけるコンペです。 以下は、いろいろな方々ののまとめです。細かいところまで丁寧に記載されており、大変勉強になりました。

Kaggle 雲コンペ 反省録 - 機械学習 Memo φ(・ω・ )

雲コンペ振り返り - Speaker Deck

やったこと

Model

UNet : EfficientNetB4, SeResNext50

Data Augumentation

albu.Compose([
            albu.Flip(p=0.5),
            albu.ShiftScaleRotate(rotate_limit=30, shift_limit=0.1),
            albu.GridDistortion(p=0.5),
            albu.OpticalDistortion(p=0.5, distort_limit=2, shift_limit=0.5),
            albu.Cutout(num_holes=1, max_h_size=128, max_w_size=128)
        ])

loss

bce_dice_loss

Optimization

RAdam

その他

セグメンテーションは初めてだったのですが、これにすごく助けられました。

github.com

セグメンテーション以外にも分類としても学習モデルを作成し、足切りとして使いました。

結果

f:id:saihyou:20191214201746p:plain

Private Leader Board 117位で銅メダルでした。

反省点

よかった

分類コンペでやったことがセグメンテーションでも生かすことができたのはよかったと思います。 APTOSとは違って、銅メダルは何とか確保できたというのは、まあ、よかったような。

悪かった

APTOSでの反省点が全く生かされず、Public Leader Boardを追求してしまったというのが最大の反省点でした。ひどい。全く成長していない。 目標が銀メダルなのに最後は全然届く気もしなかったというのが本当に残念でした。

このコンペはデータがそれほど多くなかったため、Validationを適当にしてしまったのが最悪でした。 本当に前回のコンペから成長していない。。。 データが少なかろうが、Validationは本当に大事なので、ここで手を抜いている限りはこれ以上の順位には行きそうにもないなと思いました。

全体を通して

振り返ってみると、APTOSの後半からは本当に思考停止でただ学習させていただけの状態だったような気がしてなりません。 コンペの中盤でそこそこ上位まで上げることはできていても、最後までキープできていないし、金圏内には一度も到達できていないので、 根本的にはインプットが足りていないということだと思います。 それに加えて、去年のはAWSに課金しまくってそれなりに実験していたので、もうちょっと最後までなりふり構わず突っ込んでいく気合が足りなかったなと思いました。

あとは、惰性でkerasを使ってしまっていたのですが、最近は本当にpytorchが人気なので来年こそはpytorchも使えるようになりたいなと思います。

コンペへの取り組み方

twitterを見ていると、いきなり金メダルをとったりあっという間にmasterになるような人がいたりと、世の中はすごいです。 周りを見るといろいろと比べてしまうのはどうしようもないですが、個人的な目標を達成することが一番大事だと自分に言い聞かせてやっていけたらなと思っています。

思考停止でただ学習させているだけでもちょっとは学びになるし、 特にインプットに集中するとかの目的がなければ、いい成績をとれなくてもコンペ出ることは大事だと思っています。 きちんとしたインプットをもって、コンペに取り組むことがもっと大事だというのはわかっているんですが、なかなか難しいです。

来年こそは、masterに少しでも近づけるようにできたらいいなあと思いました。 あと、画像コンペ以外もやっていきたいなあと思っています。

*1:Santander Customer Transaction Predictionもちょっとだけサブミットはしているのですが、実際にはほとんど何にもしていないので、これについてはなかったことに。

AWSに400ドル使ってkaggleでSilverメダルを取ってみた

はじめに

毎年11月ころに将棋電王トーナメントがあって、そこに向けて将棋ソフトを強くするのが、目標の一つだったのですが、残念ながら昨年で終了してしまいました。

dwango.co.jp

そうして目標の一つが消えてしまった上に、最近は人生に迷走気味というのもあり、新たな何かをしてみようかなという安易な気持ちでkaggleをやってみました。

 

kaggleに詳しくない場合は、以下のブログとか読んでみるとよいかもです。コンペの説明や用語も丁寧に解説されていてすごい!

www.topgate.co.jp

kurupical.hatenablog.com

 

スタートライン

まずは、いくつかある開催中のコンペの中からどれに参加するかを探しました。やっぱり、DeepLearningかなということで画像コンペにしてみることにしました。終わりまでまだまだ余裕があるコンペがよかったので、以下のコンペに参加してみることにしました。

Human Protein Atlas Image Classification | Kaggle

 

DeepLearningについてはまったくの素人で、サンプルを動かした程度の知識でした。持っているPCはsurface Proのみのため、DeepLearningはなかなかハードルが高いなあという印象でした。

まあでも今どきはGoogle ColaboratoryなんていいものがありGPUがなくてもDeepLearningができるようになっているので、こちらのみを使って無課金でゆるゆると楽しもうかなという感じで、最終的に半分より上にいればいいかなくらいの気持ちでした。

 

Google Colaboratoryをkaggleで使うために以下を参考にさせていただきました。

qiita.com

 

qiita.com

  

前半

とりあえず少ない知識を総動員したところ「ImageNet」「Pretrained」「Finetuning」という言葉が下りてきたのでまずはこのあたりからスタートしようかなと思いました。Kernelを探せばそんな感じのがありました。

Pretrained InceptionResNetV2 base classifier | Kaggle

 

まずは、上記のkernelをほぼコピペしたものをsubmitしてみたのですが、Public Leaderboardで0.17くらいでした。とりあえずベースはできたのでこれを手掛かりにいろいろ適当に試しつつ、しばらく遊んでいました。

最終的には、512 x 512の画像をランダムに切り出して299 x 299にして学習させたのが一番成績がよく、Public Leaderboardで0.39くらいになりました。順位にして全体の50%程度。まあ、初めてなのでそんなもんですよね。

 

中盤

Discussionとかいろいろ眺めると解像度が重要で、512 x 512の画像じゃないと勝負にならなそうです。まあ、いままでの感触からそんな雰囲気です。

Pretraindモデルには見切りをつけて、0から学習させてみようと思い検索すると以下の実装が見つかったので、これを使ってResnet34で学習させることにしました。

github.com

 

Public Leaderboardで0.49となり、なんと、ぎりぎりSilverメダルあたりまで行きました。

となるとちょっと欲がでてきて、目標をただ参加することから最低でもSilverメダルを取ることに変更しました。

そうなると解禁するのが課金です。圧倒的課金で足りない実力をカバーしに行くことにしました。何がいいのか試してみなければよくわからないのに、環境が貧弱ではできることが限られてしまいます。

GCPを使うのがkaggleでは王道なのかなとか、GPUをつかうにはGCPの方がいいのかなとか思っているのですが、面倒だったのでさっさとAWSでやりました。使い慣れているし、惰性です。

AWSを使うのに特に参考にしたものはなく、Spot InstanceでDeepLearningのAMIを適当に検索して使いました。 

 

この時期は、以下の実装を参考にGAPNetを色々変えて試してみたり、

GapNet-PL [LB 0.385] | Kaggle

ResNet34をちょっとずつ変えて色々試したり、GRBYの4chで学習させてみたりとしていました。

GAPNetはResNet34を超えることができずに断念しました。4chでも3chでもそれほどスコアに差はありませんでした。

色々試しましたが、Public Leaderboardで0.54くらいで頭打ちな雰囲気が漂ってきました。順位も80位くらいまで落ちてきました。

このままではBronzeメダルも怪しくなってきたので、AWSインスタンスを2つに増やし、重課金状体制を構築しました。他にもコンピューター将棋用のc4.8xlargeを常に1インスタンス回していたので、お金がどんどん飛んでいきました。つらい。

 

終盤

Discussionを読むとPretraindモデルを使っている人が多そうなので、試してみることにしました。うーん、そうなのですか。

kerasだと以下のが手軽に試せそうなのでやってみました。

github.com

 

Resnet18でとりあえず試してみたところ、0.554になりちょっとだけ改善しました。というわけで再びPretrainedモデルに戻ってきてしまいました。

まずは、単体のモデルで精度が出ないとどうしようもないかなと思い、12月いっぱいくらいまで単体モデルの精度向上を試していました。入力画像をRGB以外にも試してみたり、損失関数を変えてみたりとか試していたのですが、それほど成果はあがりませんでした。

ただ、以下のDiscussionを見る限りでは同じくらいのみんな同じような感じだったのでそれほど悪くはないのかなと思っていました。

Best single model without leak | Kaggle

 

 年末年始の休みに入ってから、p3.2xlargeに変更しさらに課金力を上げました。ちょっとお金かけすぎかなと思ったのでコンピューター将棋用のインスタンスを止めました。最後は力ずくで伸ばしてやろうと思いました。

アンサンブルをどうすればいいかよくわからなかったのですが、とりあえず単純平均すれば悪くはならないだろうと思い、各モデルの出力を単純平均しました。それなりに向上していき、Public Leaderboardで0.6を突破し40位前後をうろうろするようになりました。

 

結果

結局、ResNet34、ResNet50、Xception、InceptionV3、InceptionResNetV2をRGB、YGB、RGYの画像で学習して、各出力の単純平均を取りました。閾値の決め方もよくわかんなかったので、検証用のデータセットで一番スコアがよくなるような値を採用しました。最終的な良し悪しの判断をPublic Leaderboardに任せてしまったのですが、よくなかったかもしれません。

Public Leaderboardでは、36位だったのですが、Private Leaderboardで大幅に順位を下げて68位でした。残念。なんとかSilverメダルを確保できて目標達成ではあるのですが、うーん、もっと上に行きたかった。というか爆下げはダメージがでかい。

そして、AWSへは400ドルくらい貢いだような気がします。400ドル貢いでSilverメダルなのでコンピューター将棋より少しマシなくらいですか。。。

 

おわりに

Kernelを読んで何してるのかある程度わかるくらいの知識があれば、スーパーソフトウェアエンジニアではなくても、それなりに頑張れば初心者でもSilverメダルまたはBronzeメダルくらいまではいけそうです。

Kernelの意味があんまり何やってるかわからなくても、たくさん実験すれば何とかなるような気がしました。

Silverメダルくらいまでは運が向けば行けそうな雰囲気ですが、Goldメダル以上を目指すならきちんとした実力を身につけないと難しそうです。

 

kaggleやりたいと思っている人はタイタニックじゃなく開催中のコンペにいきなりチャレンジしてもいいのかなと思いました。開催中のものの方が単純に楽しいですし。

 

kaggleはもうすこしちゃんとやってみようかなと思います。コンピューター将棋にも少しはプラスになるといいのですが、今のところあまりプラスにならなそうです。

あと、課金はつらい。だれかGPUのマシンをください。

ゆるく(簡単に実装できて)ふわっとした(理論を使わない)評価関数の学習

はじめに

これは、

www.adventar.org

の12/19分です。nozomiというソフトでコンピューター将棋の大会に出ています。この前の第4回電王トーナメントでは1回戦負けでしたが、決勝トーナメントまで行けました。

 

コンピューター将棋は、ここ近年いろいろなフリーソフトや情報が出回ってきて、だいぶとっつきやすいものとなってきています。

だけれど、評価関数を自分で学習するとなると、機械学習が難しかったりマシンパワーを使ったりでとても大変です。

ここでは、強くするには役には立ちませんが、ゆるく(簡単に実装できて)ふわっとした(理論を使わない)学習で、楽しくコンピューター将棋の評価関数を作成してみます。

 

指せば指すほど強くなる?

機械学習って、詳しくない人からすると、「対局を繰り返していけば、コンピューターは学習していきどんどん強くなる」みたいなイメージのようです。

今回の方針として、「対局後にその対局を振り返り、学習をする」プログラムを目指してみます。 

基本的には、以下の感じでやってみようと思います。

  • プログラムはnozomiをベースに作成
  • 評価関数はnozomiで使用しているKPP(玉と任意の駒2つ)とKKPT(先後の玉と任意の駒と手番)
  • 対局相手は、「技巧」を使用する

    github.com

  • 対局は、秒読み0.1秒で、1局ごとに先後を入れ替える
  • 対局後、評価関数のパラメーターを更新する

 

褒めて伸ばす

結局、モノを教える場合の基本は褒めて伸ばすことだと思うんですよね。勝った局面に対して加点をしていけば、同じ間違いをなんども繰り返してしまう人間なんかと違って、コンピューターはどんどん学習して、良い手ばかり指すようになっていくんじゃないのかな。

というわけで、以下のような感じで、学習をしてみようと思います。

  • 先手が勝ったのなら、各局面のパラメーターに、+1加点する
  • 後手が勝ったのなら、各局面のパラメーターに、-1加点する

そんな感じで、10000局対戦して得られたパラメーターの結果がこんな感じです。

秒読み0.1秒で、3000局対局させてみました。 

f:id:saihyou:20161209153846p:plain

0対局後は、パラメーターが全て0の状態です。

 

うーん、これじゃあまり強くならないようです。ちょっと対局を見てみると、序盤の得点がすごいことになっています。

f:id:saihyou:20161209154915p:plain

 

𠮟って伸ばす

ほめて伸ばすのはよくなさそうですので、叱って伸ばすことを考えてみます。

負けたのに自分に有利な点数をつけている局面があったら、叱って修正してあげましょう。また、勝ったのに自分に不利な点数をつけている局面も、同様に修正して行きましょう。以下のような感じです。

  • 先手が勝った場合、+の点数をつけていない局面に対して、各パラメーターに+1加点する
  • 後手が勝った場合、-の点数をつけていない局面に対して、各パラメーターに対して-1加点する

10000対局後の結果を見てみましょう。同じく、秒読み0.1秒で3000対局の結果です。

f:id:saihyou:20161209155350p:plain

いい感じです。もうちょっとやってみた結果は、こんな感じです。

f:id:saihyou:20161211205852p:plain

順調に強くなっているようです。

 

終わりに

最高の教師を用意したので、そこそこは強くなりましたが、でもまだ全然弱いです。今公開されているフリーソフトの数々には足元にも及びませんし、Bonanza6.0と対戦させてもまだまだ勝てません。

もうちょっと対局を続ければもう少しは強くなりそうですが、それも限界がありそうです。70000対局終了時点で、点数のついているパラメーターは約7%しかなかったので、局面をばらけさせるともう少し伸びしろはあるかなといった感じです。

技巧を教師としたのなら、出来れば技巧と同じくらいまだ強くなってほしいですが、そこを目指すならゆるふわより、難しい理論とか大量の棋譜とかが必要になりそうです。

そうでもないなら、それなりにどんなやり方でも、KKPとKPPの3駒関係を使う限り、そこそこ上手く行くのではと思っています。