オオハタの研究ノート

考えたこととか勉強したこととか、書いていきます。

IGGGとの3年間振り返り

この記事は群馬大学電子計算機研究会 IGGG Advent Calendar 2020 - Adventar 21 日目の記事です。

遅刻しましたが21日目の記事です。 小見出しがリンクになっています。

IGGGとの3年間振り返り

大学2年生から参加したIGGGも3年目となり、卒業を控える頃になりました。 無事大学院への進学も決定し引っ越しの準備をし始めています。 丁度良い機会ということでIGGGで過ごした3年間を振り返ってみます。

2年

専門課程へのオリエンテーションのIGGGの紹介コーナーでこのサークルの存在を知りました。 1年生が終わる頃、あっという間に過ぎた1年に焦りを感じ大学生活のうちで何かしら頑張っておきたいと思っていたので、ちょうどよい選択肢でした。

IGGG_Briefing_#2018-June

では初めて勉強会的なものを体験させてもらいました。線形回帰を試しましたという話をしました。すごく懐かしい。

IGGG Journal "Lollipop" Vol.08

機械学習の流れで簡単な深層学習の記事を部誌に寄稿しました。 ついでに4コマ漫画を描き、コミケ作家デビューも果たしていました。

実はこの次の次のコミケでは参加申請するのを忘れ、出版を途絶えさせてしまいました。。。

アドベントカレンダ

書きました。初めて作ったWebアプリMoSyaMoSyaをHerokでデプロイするところまで漕ぎ着けることができてすごく嬉しかったのを覚えています。

IGGG_Meetup_2019-Spring

新年を迎えIGGGの部長になり、みんなの集まる機会が欲しいということで開催しました。 教室の予約なんかが大変でしたがなんとか終えました。 時間を割いて参加してくださったり協力してくださった方ありがとうございました。

3年

3年生最初の活動は2年生向けオリエンテーションでの部活の宣伝でした。 去年自分がされた宣伝を次は自分がしているというのが不思議な気持ちでした。

この宣伝で入部してくださった方ありがとう。ちょっとうれしかったです。

IGGG_Briefing_#2019-Apr

新メンバーを迎えようということで開いた会でした。 多くの方にご協力いただきました。 平成最後の日に開催されました。

群桐祭_2019

群馬大学桐生キャンパスの文化祭にIGGGとして出店しました。 いろんな人に準備や出し物を手伝っていただきました。 僕はUnityのARシューティングゲーム機械学習による画像生成アプリを展示しました。

自分の展示物を誰かに楽しんでもらうというのはとても良い体験でした。 嬉しかったです。

出店人気投票で2票入っていたのも嬉しかったです。

アドベントカレンダー

書きました。部長も世代交代をしました。

4年

部のSlackに#super-jokesというイカしたジョークが集まるチャンネルを作りました。僕がほぼ一人で修行しています。。。

先輩がMeetUpを開催してくれました。 新メンバーにとっては自分はもう本当にわからない人なんだな~としみじみした記憶があります。

夏に大学院試験がありました。無事合格し、安心して卒研に取りかかれています。 Juliaで実装したものがCUDAのメモリ管理をうまく行っておらず、自分では回避できなかったのでPythonで書き直してします。 ちょうど今再実験を回せたのでこの記事を書けています。

結び

振り返ってみるとIGGG関連だけでも色々したのだなーとなっています。

おそらくこれは個人ではできなかったことです。 一人ではなんとなくやめてしまうようなことも、わからないことを聞ける人がいたり、 なんとなく周りに人がいるということだけで続けられている部分がありました。 部の性格上顔を合わせるということは少なかったですが、Slackの投稿やリアクションがかなりモチベになっていました。 ありがとうございます。

部のSlackには残るはずなのでよろしくお願いします。

また適当に話したいですね。

快適な日本語入力を巡る旅

この記事は群馬大学電子計算機研究会 IGGG Advent Calendar 2020 - Adventar 9 日目の記事です。

もう四年生も終わりに近づいてきています。 大学生活はあっという間でした。 現在卒論に追われています。

快適な日本語入力を巡る旅

一時期、 「コンピュータ上で日本語を入力するには一体どの方法がベストアンサーなのか」 という問題について色々考えていたことがありました。

現在僕は、「備え付けのJIS配列キーボード」で「VS CodeEmacsバインド」で「macOS標準のIMEのかな入力」を使って文章を書いています。

ここに至るまでの検討の道を振り返ってみます。

基本方針

  • 極力デフォルト設定を用いる (種々の変更の管理と把握が面倒であるため)
  • どれだけ一般的かも考慮に入れる (自分のマシンでしかうまく動かせないを避ける)

ローマ字入力 VS かな入力

ローマ字入は恐らく一番一般的な入力方式! 母音と子音の組み合わせで日本語を入力していきます。

o ha yo u => おはよう

かな入力はJIS配列のキーボード上にプリントされた平仮名を直接入力して入力する方式です。

お は よ う => おはよう

ローマ字入力は基本的にキーボード三段で入力が可能ですが、 かな入力は4段のキーが必要で手を動かす範囲が増えます。

しかしながらかな入力はキーを押す回数がローマ字入力に比べて少ないと言うメリットがあります。 約半分。これはすごいことです。 ローマ字入力でガチャガチャガチャとしても、平仮名になって短くなって、漢字変換でさらに短くなるのは見ていて辛いです。

そんなわけで僕はかな入力を練習しました。

DDSKとAZIK

プログラミングに使うエディタをSpacemacsにしていた時期がありました。 この時SSKとAZIKというものを知りました。

SKK

SKKEmacsで動く日本語入力システムです。https://ja.wikipedia.org/wiki/SKK
これを発展させてOSレベルでもSKKが使えるようにしてくれてあるものもいくつかあります。

SKKはモードの概念があります。 平仮名モードで入力した場合は平仮名が確定された状態で打ち込まれます。 カタカナモードで入力した場合も同様で、英文モードもあります。

変換したい時のみ変換キーを押して、漢字にしたい平仮名を打ち込み、再度変換キーで変換します。

一般的な入力は「適当な長さを入力 ->SPACEキーで変換」と言う流れですが、 SKKは手書きをする感覚に近いです。 手書きでは先に平仮名が出るのではなく、漢字を書くぞ!と思ってから漢字を書き、平仮名を書くぞ!と思って平仮名を書きます。

「もの」、「こと」、「いく」あたりの文脈に応じた変換が簡単にできます。

スシテム自体はよくできていると思ったのですが、10年後活発に生きているものかと言う点と、 最新の語彙に対応している辞書かと言う点を考えるとマイナスポイントだと判断して使うのをやめました。

AZIK

http://hp.vector.co.jp/authors/VA002116/azik/azikinfo.htm

ローマ字入力の拡張版という位置付けです。 ローマ字入力は子音->母音という入力順ですが、母音は5種類しかなく無駄なキーが生まれてしまいます。 このような無駄なキーに妥当な変換を割り当ててローマ字入力を便利にしよう!というものがAZIKです。 すごい発想です。

例えば二文字目に「ん」が来るような時は Z(Aの下)、 K(Iの下)、 J(Uの下)、 D(Eの下)、 L(Oの下)を押すことによって「母音+ん」の入力が一ストロークで済みます。

T Z J J -> たんじゅん

その他色々な拡張があります。 かな入力よりも少ないストローク数で入力できる場合もあります。

かな入力を覚えるのは流石にめんどくさいという人にもお勧めできます!!

ただかな入力を知っていた身としては、AZIKストローク数を減らしたところでかな入力でも同じストローク数であるようなケースが多く、かな入力に戻りました。

Vim Emacs バインド

Vim/Emacsはプログラミング界隈で著名なエディタです。 Command/Win + C でコピー、矢印キーで移動というよりも、 さらにテキスト編集に優れた機能が沢山です。

現在僕はVS Codeというエディタを使っているのでVim/Emacsユーザではありませんが Vim/Emacsキーバインド(キーボードショートカットのようなもの)を模倣した 拡張機能があるのでそれを用いています。

Vimはモードという概念があります。ノーマルモードで移動、コピペ、削除、ビジュアルモードで選択、挿入モードで入力します。

Emacsはモードという概念はなく、代わりにCtrlキーやOption/Altキーを多用します。

英文のみの場合はVimバインドが心地よいと感じることが多いですが、 Vimのモード変更の際に一旦かな入力から英数入力に戻さなければならず、不便でした。

Emacsバインドはかな入力時でもCtrl/Option/Altキーを用いた操作は可能なので 日本語入力という面ではこちらが向いていると感じます。

まとめ

一口に日本語入力と言ってもいろんなものがあるのだと改めて実感しました。 色々な入力方式を試してみるのは面白いですね。

参考になれば幸いです。

おまけ こぼれ考察

Dvorak配列

英語入力においてはかなり効率的に入力できるらしいです。 ただ英語入力においてだけであり、Vim/Emacsキーバインドとは相性がよくないという話を聞きました。 QWERTY配列のJISキーボードが備え付けられているのにわざわざ変更するの? という点と、一般的ではないという点から導入に積極的ではありません。 とはいえ少しの興味はあるのでいつか試すかも知れません。

IME

標準以外だとMozcやATOKGoogle日本語入力が有名ですね。 お金ないので無料のものを使いたいです。 今は標準のものを使っていますが、今度Google日本語入力入れてみることにします。

SketchRNN を作った

SketchRNN を作った

この記事は群馬大学電子計算機研究会 IGGG Advent Calendar 2019 - Adventar 15 日目の記事です。一週間遅れの.

B3 であるということもあり,研究室ではあまり成果を要求されることはないので ゆるりとやっており,その一環として SketchRNN を作りました.

結果はこんな感じです.

f:id:KenjiOhata:20191222192536p:plain

モデル概要

SketchRNN は Google の Magenta プロジェクトの一環として作られたスケッチ生成のための モデルです.

中身の基本はは seq2seq の VAE になっています.筆の動きを表す,ストロークデータを 入力することで,ストロークを再現するように学習します.

左が入力で右が出力になります.

f:id:KenjiOhata:20191222192539p:plain

SketchRNN では ニューラルネットワークの出力はストロークデータではなく, ストロークデータを生成するような確率分布のパラメータを出力します. これにより,ランダム性を残しながらスケッチ生成ができます.

詳細は論文を参照ください. https://arxiv.org/abs/1704.03477

Julia -> Pytorch

SketchRNN の作成に取り掛かったのは 11 月中旬くらいでした. 最初の段階では Julia と Flux.jl で実装することを考えていました.

Julia 採用理由として

Python のようにライブラリを通して行列演算をすることの煩わしさがないことや, exp などから標準であること,Unicode の利用で コードの見た目がかなり簡潔になることか挙げられます.

また,Julia 自体にも興味があったので速度の面や実用さを知りたかったというのもあります.

結果として,Pytorch で書き直すことになりました.

自分が書いたコードが GPU で動かなかったからです. 公式サンプルは動きますが,僕の書いたコードはエラーが残ってしまいました. 追求すれば解決できるかもしれませんでしたが,GPU で動かすことに時間を費やすことは SketchRNN 実装とは違うので本筋を見失わないうちに Pytorch に移行しました.

ただ,Julia はマクロ機能や Unicode などほんとにいい言語だと思いました. Flux.jl もまだバージョン 1 にもなっていない(2019/12 現在)のでまだ,成長を待つ段階 なのだと思いました.

オンプレ機械学習いいな

初めてオンプレでまともに機械学習をしました. 今までは Google Colab を使用して来ましたが,時間制約のおかげで, 12 時間毎に操作が要求されたり,その間のコンピュータの使用が制限されるなど ろくなものではなかったので,オンプレ最高でした.研究室に感謝です.

今回作成した SketchRNN-Pytorch のレポジトリはこちらにおいておきます.

github.com