きょうも亀だけど

機械学習やデータサイエンスの勉強記録など

AI Quest 2020に参加しました

今年もAI Questが開催されます。 aiquest.meti.go.jp

昨年秋に開催されたAI Quest 2020に参加しました。 今年受けようか迷っている方の参考に、そして己の振り返りとして書きます。

参加時のスペック

  • データサイエンスや機械学習セミナーには数回参加
  • 業務でPythonを使った分析はしたことがない

相変わらず業務で分析はしていませんが、今までの実績アピールが徐々に効いてきたのか、 Python案件に参画できるかの打診が来ました。

参加理由

1. モデル構築以外のフェーズを経験したかった
分析コンペへの参加はモデル構築スキル向上に役立ちますが、業務ではその前後のフェーズも重要です。 AI Questは要件定義から顧客へのプレゼンまで一気通貫に学習できるという触れ込みだったので、 分析コンペでは得られない部分を経験できると感じました。

2. 企業協働に参画したかった
鶏と卵問題として、
業務未経験だと業務に参画しにくい→業務に参画できないと経験を積めない→…
がつきまといます。
企業協働という形で実際に企業の方とやり取りをし、業務経験を積める貴重な機会だと感じました。

AI Questでやったこと

運営側の雰囲気として、公開されていない情報はあまり個人で公開してほしくない感じだったので、可能な範囲でまとめます。 なお、教材のサンプルが以下で公開されています。 www.meti.go.jp

1. ターム① ケーススタディ
参加登録時に選択した希望コースに所属し、ケーススタディを実施しました。 画像分野の経験がなかったため、画像処理に関するコースを希望しました。
要件定義 → モデル開発 → プレゼン資料作成 → 他者プレゼン評価
の流れで課題に取り組みました。

2. ターム② 企業協働
参加登録と面接を経て、企業協働に参加しました。 参加希望者が多かったためメンバーの絞り込みが行われましたが、無事メンバーに選ばれました。 企業協働に参加しなかった方はケーススタディの2回目に参加していました。 企業協働では企業の方とミーティングをし、要件定義から運用計画、プロトタイプ提供までを一気通貫で実施しました。 企業協働の成果はこちらで公開されています。 www.meti.go.jp

AI Questで得られたもの

1. 仲間
同じ興味を持つ仲間とのコミュニティに参加できました。 コロナ禍を考慮し完全オンラインで実施されたため、参加者の皆さんと直接お会いすることはできませんでしたが、Slackやオンライン会議ツールなどで コミュニケーションできました。オンライン会議での自由行動中にたまたま同じ部屋に集まったメンバーとは今でも雑談や情報交換をしています。 様々な背景を持った方たちとの交流は刺激的でした。

2. 企業協働の経験
モデル構築以外のフェーズをリアルに経験できました。モデル構築には時間をそこまでかけず、

  • AI導入による期待値はどのように考えているか
  • 運用負担を軽減するためにはどのような設計を行うのがよいか

などに時間をかけたことで、分析コンペでは得られない経験を積めました。 また、企業の方から感謝の言葉をもらった際には、「やってよかったな」と充実感を得られました。

成果

各タームで以下の成果を残せました。

  • ケーススタディ → 総合優秀賞受賞(モデル精度とプレゼン評価の合計が上位5%)
  • 企業協働 → プロトタイプの納品、実用化に向けて検討

AI Questの良かった点、改善点

2019年の試験実施を含めると2回目の実施となったAI Questでしたが、良かった点、改善点それぞれに対して感じたことをまとめます。

良かった点

1. 自由度が高い
「42」を意識しているためか自由度が高かったです。 xtech.nikkei.com 講師と呼ばれる方は存在せず、運営側からは課題の提供とコミュニティ促進のための場の提供、質問や相談に対する回答のみが行われました。 講師から学ぶ方式だと受け身になりがちなので、自分で動く必要があるこの方式は個人的に好きでした。 Slackのチャンネルも有志でどんどん追加されていったので、好きなコミュニティにゆるーく参加できたのも楽しかったです。

2. 時間の拘束がゆるい
完全オンラインとなったため移動時間はなく、必須参加の集まりも数回のみかつ休日だったため、時間のやりくりがしやすかったです。 もちろん課題消化のための時間は必要ですが、自分で時間を調整できるのは大きいです。

3. プレゼンの評価基準が提供された
プレゼン資料の評価基準が数値で表現されており、今後の業務でも参考になるなと感じました。
※評価基準の内容については参加者内で賛否両論だったので、気に入った人が参考にすればいいと思いました。

4. 運営方式に意見できた
運営側もまだ2回目ということもあり、不慣れな部分やスムーズにいっていない部分がありました。 そういったところに対して参加者が運営側に意見をし、改善していくというサイクルができていました。 完璧な進め方というのはないのかもしれませんが、参加者が運営側に改善提案できる雰囲気は良かったと思います。

改善点

1. 運営側の連携が甘かった
複数の企業、団体が運営に関わっていたことで、運営側としての意思統一ができていない部分がありました。 例)
 情報公開について、ある運営の方が公開していいと言った後で、別の方から情報公開にストップがかかるなど 連携の難しさはわかりますが、ときどき参加者が混乱していたように思えました。

2. 運営側のファシリテーションが微妙だった
企業協働時に企業の方とミーティングする際に、運営側の方がファシリテーターとなることがありました。 こちらのプレゼン後に企業の方とディスカッションをしようと思った際に、
「では本日はありがとうございました。」
と突然締めの言葉に入ってしまったのが残念でした。 ある程度参加者側に委ねてもいいのではないかなと思いました。

こんな人におすすめ

1. 能動的に動ける人
自分から動かない限り何も得られません。わからないことを聞く際も一通り試したり、考えを述べたりした上で質問すれば、他の参加者の方は優しく教えてくれます。 一方で、「何もわからないから全部教えて」みたいな態度だと誰も教えてくれません。 こういった雰囲気を受け入れられる人にはおすすめです。

2. 他の参加者とのコミュニケーションが好きな人
オンライン会議の中で他の参加者とディスカッションする場が何回か設定されます。 初級者から上級者まで様々な方と交流することになるので、いろんな人との交流を楽しめる人にはおすすめです。

まとめ

およそ半年間取り組みましたが、充実した時間でした。 参加費も無料ですし、「初心者だからもう少し勉強してから来年参加しようかな・・・」と迷っている方がいれば、思い切って今年飛び込んでみるといいと思います!

Python文法メモ

関数呼び出し時のアスタリスク

引数に渡したリストやタプルをバラして渡せる。 T.Composeの引数に渡すときなど可変長引数に柔軟に渡せるのが便利。

items = [1, 2, 3]
func(*items) # func(1 ,2 ,3)

【参考】

qiita.com

三項演算子を使ってリストに入れる要素を分岐

リスト内包表記の例を見ると大抵for文と組み合わせて使用されているが、三項演算子単独でリストに入れる要素を分岐できる。

flag = True
hoge = ['a' if flag else 'b']
# a

Anaconda環境へのライブラリインストールコマンド一覧

環境構築時にまっさら環境からライブラリをインストールするときのコマンドまとめ。 conda-forgeはユーザーグループが管理しているリポジトリらしい。 analytics-note.xyz

conda install -c anaconda pandas
conda install -c conda-forge matplotlib
conda install -c anaconda seaborn
conda install -c anaconda scikit-learn

環境に合わせてインストールコマンドを選択

PyTorchでCUDAを使ってGPUで学習をさせたときに「Expected all tensors to be on the same device, but found at least two devices」が出たときの対処

GPUを積んだローカルPCでPyTorchの転移学習を試した。以下を参考にCUDAでGPUを使用して学習させた。

www.amazon.co.jp

結果、Optimizerの実行箇所でタイトルのエラーが発生した。
tensor使うなら全部GPUでやらなきゃいけないのにCPUが混ざってるぞ」と言われているのは分かったけど対処法がわからない。

optimizer.to(device)

とやってみたけどダメ。 最終的に以下のページにたどり着いた。

discuss.pytorch.org

以下の関数を定義した。

def optimizer_to(optim, device):
    for param in optim.state.values():
        # Not sure there are any global tensors in the state dict
        if isinstance(param, torch.Tensor):
            param.data = param.data.to(device)
            if param._grad is not None:
                param._grad.data = param._grad.data.to(device)
        elif isinstance(param, dict):
            for subparam in param.values():
                if isinstance(subparam, torch.Tensor):
                    subparam.data = subparam.data.to(device)
                    if subparam._grad is not None:
                        subparam._grad.data = subparam._grad.data.to(device)

その後、

optimizer_to(optimizer, device)

としたことで無事学習が完了した。 ありがとう、ハンス。

Anacondaの仮想環境配置ディレクトリを変更し、仮想環境を立てる

Anacondaを使って仮想環境を作る。これによりライブラリのバージョンの混在を防ぎ、各作業の環境を独立させられる。 仮想環境の配置ディレクトリをCドライブ以外にしたかったので、以下の方法で配置ディレクトリを別ドライブに設定した。

【参考】
blog.sgry.jp

環境変数「CONDA_ENVS_PATH」に配置ディレクトリパスを設定し、無事成功した。

次に、作成した環境をGit管理できるようにするため、環境設定ファイルを以下のコマンドでAnaconda Promptから出力した。 ymlファイルはコマンド実行時のディレクトリに出力される。

conda env export > env.yml

これをAnaconda NavigatorのEnvironmentsからImportすれば、環境の復元ができる。

【参考】
qiita.com

作成したEnvironmentsにJupyter Notebookをインストールする。 インストールした環境で実行したJupyter Notebookでは、その環境に存在するライブラリのみを使用できる。 別環境で作ったNotebookであったとしても、実行している環境のライブラリを参照する。 f:id:OnsenTamagoYoshi:20201024022147p:plain

環境分けられるのはめっちゃ便利。 作り直すのも簡単そうではかどる。

Anacondaインストール後にJupyter Notebookをコマンドプロンプトから起動する

Anacondaを入れ直した後、コマンドプロンプトで起動すると「DLL load failed」が出て起動できなかった。
以下の記事を参考に環境変数を設定し、順番も整理したら無事起動した。

【参考】
qiita.com

Bitbucketへの登録をせずにSourcetreeをインストールする

PCの新調に伴って開発環境を作り直した。
Sourcetreeのver3をインストールしようとしたところ、以前はなかったBitbucketへの登録が必須となっていた。
使うのはGitHubだし、登録なしで進めないか調べたところ、以下を参考にアーカイブからver2を取得してインストールしてからver3にアップデートする方法でいけた。

hepokon365.hatenablog.com