dondakeshimoの丸太

データサイエンス/Webアプリケーション/

機械学習の勉強会「夏のトップカンファレンス論文読み会」に参加して来た

勉強会?的なものに初?挑戦

すみません。文字化けみたいになりました。 本日abejaさんが企画する 夏のトップカンファレンス論文読み会 に参加して来ました! abejaさんの名前からわかる通り、機械学習の論文読み会です。 企業が主催する勉強会というものに参加したのが初めてのようなもので、 (何回か就活系で行ったことある気もする)しれっと緊張してました。

abeja-innovation-meetup.connpass.com

参加動機として、日頃から参加させていただいている実装クラブのスラックに 本読み会の情報が流れて来て、先輩に筆者のようなへぼエンジニアが参加しても意義はあるのか? と、問うたところ 「正直よくわからん!」 と言われたので行って来ました!笑 予習ばっちしって状態で行く予定でしたが、何も間に合わず前半の人が何を話すかの把握程度での 参加となってしまいましたが、 その中で筆者がなんとなく思ったことなどをまとめていきます。

ディープラーニングは今尚最盛期

まだまだディープラーニングへの熱は冷めてない模様。 一部のトップリサーチャーなどはもう飽きたという声も上がりつつも、 全体のトレンドとしてはまだまだ来ている。 一方で、火付け役となったDCNNは論文がガンガン出てくるような状況ではなく、 GANやRNNなどのCNN以外のディープラーニングの技術が来ている様子。 CNNに関してはこれまでにでた技術を礎として、 その上に何を構築するかのフェーズに入ってきているとのこと、 そんな中、

CNNの畳み込み方には改善の余地がある

という論文を読んでくださったのがyosuke_shinyaさん。 少し、内容が難しくて理解できていない部分の方が多いのですが、 ざっくり言うと既存の画像認識では矩形を設定して畳み込んでいるが、 絶対矩形じゃない方が制度出るよね!その効率的なアルゴリズム考えたよ! みたいな感じだと思います。 すみません。やっぱり何もわかってないかもです。 既存の画像認識で難しかった小さい物体の検出や精度向上が期待されるみたいです!

DNNの見える化

DNNといえばブラックボックスで そのくせにハイパーパラメータが大量にあって、 いや、なんか知らんけどめっちゃいいの出てきたすごない? みたいな分野かなと思っていたのですが、 実際結構そう言う部分があってそこに問題意識もあるようで、 中間層の見える化が進んでいるようです。 これができるようになったらハイパーパラメータの数が減るかもしれないし、 ハイパーパラメータの最適化もすぐ済ませることができると思うから お買い得技術だなと思って聞いていました。

データがやはり大事だが…

データ作成をしている人たちがちゃんといてだな

質のいいデータこそが質の良いモデル作成に必須であることは周知の事実らしいですが、 金銭的コストも時間的コストも持って行かれてかつ、 面白くない という問題だらけのデータ作成問題?アノテーション問題が横たわっているらしいです。 逆にそこに目をつけてデータを売ったり、 有益なデータセットを作成するのも大事な仕事、研究だったようで、 データが命 っていうことはなんども聞いていた気がしたけど、 データ産業の大きさがなんとなく体感できてよかったなと思いました。 また、片岡さんという方がおっしゃっていましたが、 データセットを作るような研究をしていると 問題を出す側に回ることができるそうで、そうすることで 時代を引っ張るような大きな流れを生み出すリサーチャーになれる可能性が出てくるとのこと。 なるほどです。

高価なデータを効果的に利用するという観点

坂井さんという方が発表していらっしゃった内容は、 半教師なし学習です。 正直な話、今日の読み会に出席してトレンドなどとこの発表を聞くまでは 教師の有無に関してわかっているようで何もわかっていませんでした。 教師なしとはつまり強化学習であると思っていたくらいです。 半教師で精度が出せる話を丁寧にしていただいたのですが、 これまた正直な話、多分半分もわかっていないです。 ただ、概念的な説明からしていただいて、そっちの方は理解できたかなと。 ラベル付きのデータセットはコストがかかるので、 ラベルがないデータをうまく使って、コストを抑えることができないか、 また、現実的にラベル付きデータを作成しながら学習させるよりも 大量のラベルなしデータでさらに精度の良い学習ができないか。 というのがモチベーションだと思います。 その中で発表していただいたのはうまくラベル付きとなしを混ぜて行くというもので、 案外それでも精度が出るらしいです。 なるほどです。

今回の勉強会を終えて

わかったこと

  • DCNNに関してはかなりモジュール化が進んでいる
  • DCNNを使って何かをするために最新の技術をサーベイしまくるとかはもう必要なさそう
  • データは死ぬほど重要だから大事に扱う
  • データのうまい使い方はいくらでも出てきそうだからサーベイした方が良さそう?
  • 勉強会に参加することでモチベーションが上がる
  • 機械系の筆者が行くような企業がいっぱい来てたからみんなDL勉強中
  • インターンこそ現代就活最大の武器
  • セカンドエキスパートは最強らしい
  • DNNはツールだから自分の専門に持ち帰ると良い
    • そうすることでDNNのメンターもつくかも!
  • とりあえず実装して遊ぶことから始める
  • (その場では)わからなくてもいいから勉強会に参加するのは大事
  • 大企業でDLの企画?を通すのはなかなか難しい
  • やっぱり数学も大事かも

これからやるべきこと

  • とりあえず実装 -> 現在3D GANを実装というか実装済みのものを理解せんとしてます
  • 最低限の数学的知識を得る(特に表記がわからないという絶望的状況からの脱却)
  • 情報蒐集の網を広げる -> このような勉強会があればまた参加したいなと

以上です!雑なまとめですみません!何か情報があれば教えてくれるとありがたいです。発表者の皆さんお疲れ様でした!

node.jsのgmライブラリでCopyOpacityするのに1日ハマった話するわ

gmライブラリ

node.jsにおける画像編集の鉄板?ライブラリである。 バックでGraphicsMagick(ImageMagick)が動いており、 それらをnode.jsの機能のように使うことをapiなのだろうか。 今回はこのgmライブラリを使ってはまりまくったので、 後に筆者のような愚かな人間が生まれないように記事を書く。 多少心が荒んでいるので、丁寧語が抜けていることをお許し願いたい。

今回やりたかったこと

blog.yug1224.com

サムネイルを作る目的ではないが、 こちらの記事にあるようにmaskとなるpngファイルから 透過値をコピーして、丸く切り取るようなことがしたかった。 また、作業に際し速度が必要であったため、 ImageMagickではなくGraphicsMagickを使うことにした。

compositeとconvert

おそらく、ちゃんとした区分があるのだろうが、筆者のなんとなくの理解では

  • 画像の変換系はconvert
  • 画像の合成系はcomposite

である。 GraphicsMagickにある、コマンドはそんなに多くない。 というかむしろほとんどのことは convertですませるのだろう。 convertを使う場合、基本的に画像ファイルの引数は二つだ。 ここで、問題が生じる。 maskを用いた透過値のコピーには引数が3つ必要なのである。 上記ページからもわかる通り、このような場合はcompositeを用いる他ない。

gmライブラリの仕様上注意

今回のメインディッシュである。 gmライブラリは今のところ、convertコマンドしかサポートしていないのだ。 これが何を意味するかというと,

gmライブラリで今回の目的が達成できない

最終的な筆者のソリューションは、おそらくみなさんが行なっているであろう。 child_processを使って、シェルに直接実行してもらう方針である。

// gmモジュールがcompositeをサポートしていないため関数定義
internals.gmcomposite = function(maskImagePath, tempImagePath, newImagePath, callback) {
  var gmspawn = spawn('gm', ['composite', '-quality', 100, '-compose', 'CopyOpacity', maskImagePath, tempImagePath, newImagePath]);

  gmspawn.stdout.on('data', function(data) {
    console.log('stdout: ' + data);
  })

  gmspawn.stderr.on('data', function(data) {
    console.log('stderr: ' + data);
  })

  gmspawn.on('exit', function(code) {
    if (code !== 0) {
      callback(code, null)
    }else {
      callback(null, null)
    }
  })
};

これでひとまずは実行できた。 恥ずかしい話、ここにたどり着くまでに1日の時間を要した。

GraphicsMagickのややこしいオプション

今回、ここまで時間がかかったのにはgmがサポートしていなかったことと 合い重なってGraphicsMagickのオプションがわかりづらいと言うことがある なんと、

  • convertコマンドには-composite
  • compositeコマンドには-convert

オプションが存在するのだ。 筆者は永遠とgmライブラリの-compositeオプションを使い、 どのオペレータを用いればmaskを用いたCopyOpacityができるのか延々と悩んでいたわけである。

まとめ

え、今回の問題に直面した時の反省点ですか?…マジでわからん。。。 こう言う泥沼にハマった時の対処法誰か教えてください。。

werckerをmac(docker for mac)で動作させたわ

docker for mac

なんか最近出たらしいですね。 これまではdocker toolboxみたいなので、 virtualbox上でdockerを走らせていたらしいのですが、 virtualboxじゃない仮装アプリでなんかdockerの利点を最大限生かせるようになったのが docker for macみたいな記述があった気がします ただいかんせん新しいので、ドキュメントが少ない問題に直面しまして、 誰かの助けになればいいなと一筆した次第であります。

導入手順

wercker-cliを(macに)インストールします

$ brew install wercker/wercker/wercker-cli

macにwercker-cliがインストールされたら、

$ wercker build

で、勝手にdockerがimageを引っ張ってきてくれて使えるようになります。

ちょっと解説のようなもの(間違ってる説は結構ある)

docker toolboxだとvirtualbox上にLinuxカーネルを立てて、 その上にdockerを起動し、さらにその上にwerckerをインストールして起動します。 それに対し、docker for macは仮装環境は挟んでいるものの、 基本的にはOS Xカーネルを使うらしいので、 mac自体にwerckerがインストールされていないと使えない ということで、macの方のlocalにwercker-cliを入れてあげて、 docker上で起動すると、dockerの機能でimageを探してきてくれます!

引っかかったところ

あくまでmac上で起動されているため、 node.jsに置けるbcryptのようなlinuxOS Xで挙動の違うライブラリは macの方のバージョンを入れる必要があります。 そんなん知らんやん。。。 invalid ELFみたいなのが出てきたら用心してください!!

まとめ

dockerは勉強した方が良いな完全に。。。

Macに入れてる「最初に入れとくべき!」みたいなアプリの話するわ

Macに入っているAppの紹介

そういえば最初Mac買った時ってワクワクして開くまではいいけど 何すればいいかわからなくて、 ボソッと「カッケェ…」ってため息ついて閉じてたなと思って、、
そんな状態なあなた必見! 入れといたらやるじゃないかと言われるAppを紹介するぜ!

Alfred

www.alfredapp.com

こいつは死ぬほど定番ですね!どのランキングページにも出現します。 ところで、みなさんspotlight検索って知ってますか? 最近のマックだとcmd + spaceとかで起動できるのかな。 だいたいそれの上位互換です笑 UIが洗練されてて、早いらしい、地味にいろんなコマンドが使えて、カスタマイズできる。 まぁでも、最もこれを入れる利点としては 入れてることで上級者っぽくてかっこいい ってところでしょうね笑 一つだけ使う上で注意というかオススメがあるんですが、 デフォルトではalt + spaceでAlfred起動なんですが、 Ctrl + spaceに変更することを強く推します! 冷静にalt + spaceプラインドタッチとか無理でした笑

AppCleaner

AppCleaner

Windowsってコントロールパネルからアンインストールができるんですけど、 Macそういうのないんですよね、多分。 ということでこのアプリです。依存関係のファイルを検索してくれて、 削除してくれます。操作は簡単ドラッグ&ドロップ

Avast

www.avast.co.jp

無料のセキュリティアプリです! MacWindowsと比べて市場規模が1/10程度なので、 ウイルスに狙われることは少ないとは思いますが、 別段Windowsと比べて最強って訳ではないので、 Macに愛を捧げるならセキュリティソフト入れておくと良いと思います。 Avastは筆者が調べた時点でなんとなく一番良さげだった気がしますが、 Macのユーザーはガンガン増えているに伴って、 ウイルスもセキュリティも進化すると思うので、 入れるタイミングで調べると良いと思います!

Caffeine

download.cnet.com

こいつは優秀です。インストールするとツールバーにコーヒーカップが現れます。 コーヒーカップをクリックするとコーヒーが中に入って、 Macがスリープしなくなります。 意外とスリープしてほしくない時ってあるので、入れとけば良いと思います!

CheatSheet

www.cheatsheetapp.com

Cmdの長押しでショートカットのカンペを出してくれます! 最初はめちゃくちゃ使いました! ショートカットを覚えると生産性が4倍くらいになります(主観)

Dropbox

この子に関しては一言でいいかもです。便利!

Google Chrome

www.google.co.jp

最初にSafariから乗り換えた時にびっくりするくらい速度が早くなったのを覚えています。 周りを見た感じプログラミングをするならChromeFireFoxを入れておくのが ベターな気がしますね!特にWebエンジニア! プログラマでなければ、スマホとブラウザ合わせればなんでも便利かと笑

Hyper Switch

bahoom.com

デフォルトのCmd + tabで、アプリケーションの切り替えができるのをご存知ですか? あれの上位互換です(主観)。 アプリケーションごとではなく、ウィンドウごとの切り替えが可能になります! あと、サムネールとしてウィンドウの画像が貼られるので、 フォーカスしたいウィンドウが見つけやすい気がします!

iTerm

www.iterm2.com

プログラマの定番。なぜかターミナルでは物足りなかった強者が入れている。 という印象だったので入れて見た。 タブ分けができたりなんだか色々ターミナルの先を走っていたみたいですが、 今となってはターミナルも進化してどっちもどっち説が浮上しております。 これもあれですね、 とりあえず入れといたらちょっとイカす

LINE

タイピングの方が早い人は入れるべきですね

QR Journal

QRを読み込みます! なんでもいいと思いますが、焦ってQR読み込みしたい時のために先んじて入れておくと良いでしょう。 (そんな日はあるのか?)

終わり

なんかだいたいこんな感じな気がします! プログラマ向けのもの以外もしくは、 プログラマ向けのものは入れておくだけでMacがオシャレに見えるものを選んできました! お役に立てれば幸いです!

pythonのversion周りがなんかあれな話するわ

pythonのバージョンはややこしい

python以外に4つくらい他の言語に触れたことがあるのですが、 pythonに勝る美しい言語はないと思っています。 そんなpython最大の弱点が、version問題かなと。。 python2系とpython3系があるんですが、 互換性がないとかいうね。完全切り捨て御免とかいうね。 というわけで、いろんなバージョン管理方法があるわけですが、 筆者は pyenv を使わせていただいてます。 なんかいろんな記事をさらっと読んだ感じ、 virtualenvデファクトスタンダードで、 pyenv がかなりこなれてて、 venv とかいう公式のバージョン管理ソフトができたっぽい。

…いや、待て。なんでややこしいバージョン管理を簡潔にしたいのに、 その方法でまた悩まなあかんねん!! ってことで、師匠に教えてもらったpyenvから一歩も動くことなく、 盲目にこれがいいと信じながら使っております。

現在の管理状況

機械学習始めたらめっちゃバージョン管理必要になった

問題は 機械学習なんですよ 。 最近勉強会に参加させていただいていて、 発表者の方がちゃんとipynb形式でデモを実行できるように準備してくれるんですけど、 pythonのバージョンが割とまちまち… 具体的に機械学習で使うバージョンは多分

  • 2.7
  • 3.5
  • 3.6

だと思うんですけど、 2系と3系の相互互換がないのはいつものことで納得いくんですが、 何故3.5と3.6までうまくいかないんだ!? ということで、原因を探るよりも もうpyenvに全部入れてしまえばよくね!? ってなりました。 というわけで現在、筆者のpyenv管理下には上記のpythonバージョンを含んだ anacondaが3つぶち込まれています。それぞれに pytorchtensorflow がぶち込まれています。 なんか汚らしい気がするので、こういう状況での ベストプラクティスをどなたか教えてくださると嬉しいです。

pyenv-virtualenv

機械学習では使うの面倒だなってなりました。 誰かとコードを共有するってなったら Dockerでも勉強するか…と思っています。 それ以外の、例えばデスクトップアプリなどでは大活躍してくれていますが、 どんどん環境増えたら管理がまた面倒になるなと思って、 みなさんがどういう管理をしているか気になります。

まとめ

もう自分で使う分にはとりあえず依存関係考えずにやろうかなと 開発の段になった場合にDockerの導入か、 virtualenvの導入か、(pyenv-virtualenvは開発の仮想に向かなそう?) やらを考えることにしました!(必殺後回し戦法!)

JavaScriptに入門し始めたからまとめていくわ[part2]

went-went-takkun135.hatenablog.com

上記の続きです!

基本仕様後半戦!

ここからが難しいところなのでしょうね。 気合をいれて臨みたいと思います。 まじで早くNode.jsまでたどり着きたい!

変数とオブジェクト

代入

  • 基本型のリテラルは値を代入
  • それ以外のオブジェクトは参照を代入

だけとりあえず覚えておけば良さそう! バイト先でオブジェクトの値コピー方法を何回もググってる気がするけど、 未だにどれが正解かわかっていない。

オブジェクト

めちゃくちゃ長くて、 ちょっと難しすぎたから割と読み飛ばしてしまった。 おそらく著者が言いたかったことのエッセンスは

  • 基本型以外のものは全てオブジェクト
  • オブジェクトそれ自体には名前がなく、 名前がある変数などに参照を代入することで固有の名前を得る
  • オブジェクトは内部にプロパティを持ち、 アクセスはドットかブラケット
  • 連想配列としての使い方もある
  • this参照には注意が必要
  • 実質のクラスとしても使用可能
  • クラスの継承みたいなのはプロトタイプ継承というものによって行われる
  • 型判定やプロパティの列挙は汎用性が高すぎるせいで多少面倒

大変だった5章

この章めちゃくちゃ長くて力入れてるのがひしひしと伝わってきたものの、 めちゃくちゃ意味不でめちゃくちゃ眠かった(2,3回じゃないほどの寝落ち)。 しかし頑張っていきたいと思います。。

関数とクロージャ

スコープ

クロージャ

言葉遣いは難解だったけど、 過去最高にわかりやすかった気がする。

function() {
  var cnt = 0;
  return function() { return ++cnt; }
}

var fn = f();
fn();  // 1
fn();  // 2
fn();  // 3

上記コードのように関数呼び出し時に関数を返すようにすると、 関数呼び出し時に生成されるCallオブジェクトなるものが 消去できなくなるため、ずっと同様のCallオブジェクトで この関数オブジェクトが呼び出されることとなり、 関数内の情報が保存されるという仕組みらしい。

モジュールがない

モジュールっぽい概念が言語仕様上はないらしいです。 一つのプロジェクトのグローバル変数が共有されるので、 大事故につながる恐れがあります。 そのため、一つのファイルをクラスのように括ってしまうなどの 対策が迫られるらしいのですが、それでもprivateな変数は作れません。 そこでクロージャ!みたいな感じの話でした。

データ処理

についての記載があった。 配列に関してはものすごく詳しく書かれていたが、 実用上はそれほど細かい知識は必要なさそうなので割と目を通した程度。
JSONはeval関数を使わないこと。
Date関数はクライアントサイドで使うと面倒なことと、 実行環境に依存すること。
正規表現リテラル表現が存在し、

var reg = /^\s+/;  // 先頭文字が空白
var reg = new RegExp('^\\s+');

のように記述する。他にもStringオブジェクト側から、 引数に正規表現を用いる技法も存在するが、 ここの難点は主に正規表現そのものなので、 JavaScript側で難しいことはそれほどないと思う。

まとめ

これでJavaScript基本仕様については終了! らしいがこれで実際にコードちゃんと読めるかは微妙なラインな気がする。 理由としては、 コード規約自体は簡単なのに、変なイディオムとか メソッドチェーンとかコールバック関数とか見慣れない使い方が多い みたいな感じやと思う。

つまり、結論

慣れが大事。

次回からはクライアントサイドの説明をしてくれるそうです!

JavaScriptに入門し始めたからまとめていくわ[part1]

JavaScript始めました

本当はインターンでずっと使ってたんですけど、 一切体系的に学んでおらず、 なぁなぁでコーディングをそろそろ脱却せねばと一念発起いたしました。

上司の方にこの本とかがいいんじゃない?と言われ、 即購入、その間30秒。 失敗したのは当日暇だったので 普通に大学で買えば当日から始められたのにということですね!
もう一つ失敗を付け加えると、この本は めっちゃJava学んでる前提で話進めてくる んですけど、筆者はまったくJavaに触ったことないことくらいですね!
ということで、今読んでる最中なのですが、 入門書に関しては読んだ後にレビューではなくて、 要点を読みながら書いた方が絶対いい気がするので、 章が終わるたびに書き足して行っています!

JavaScriptの概要

ブラウザ戦争とかいうものがあって、 ブラウザの独自拡張が繰り返された時代があったそうな、 JavaScriptもその戦争のせいか、 はたまた醜い人間たちの性か、 独自拡張性が高い言語になってしまったそうな。 これでは非常に使いづらいということで、ECMAScriptなる規格が発足。 現状では、JavaScriptが新しい機能を備えたバージョンを開発していき、 それに対してECMAScriptが順次それを規格化していくという流れだったような。 とりあえずは規格化されたECMAScriptを使っていれば安心ってことなのだな?

JavaScriptの基本仕様

JavaScriptの型について

JavaScriptの基本型

上記の5つが基本型となり、その他を全てオブジェクト型という。

基本型のオブジェクト型

適切な表現が思いつかなかったので意味不明な題名。 上記5つの基本型に対応するオブジェクト型、クラスが存在する。 しかし、暗黙の型変換(基本型 <=> オブジェクト型) によってその存在は認識していなくても 実質問題ないっぽい。 ので、頭の片隅にしまいながら、 基本的には忘れていて大丈夫っぽいというか、 積極的に忘れて暗黙の型変換を使っていくのがベストプラクティスなのだとか。

型変換(数値型 <=> 文字列型)のイディオム

クライアントにjsファイルをぶん投げる際、 なるだけ短い文章で書いた方が通信量が抑えられて良いということから、 暗黙の型変換を使った最短表記がしばしば用いられるそうな。 可読性は低そうだけどよく使うなら慣れておかねばだ。

// 数値から文字列
var n = 3;
n+'';

// 文字列から数値
var s = '3';
+s;

JavaScriptの式と文

式式文文式文文 む〜ら〜さ〜ぁき
どこかの歌手が頭から離れない章名。

呪文でしょうか、いいえ誰でも。。?

文の種類

基本的に文は;で区切られた一区画を指す。その種類として

  • ブロック文(複合文)({}で囲まれたもの)
  • 変数宣言文
  • 関数宣言文
  • 式文
  • 空文
  • 制御文
    • if-else文
    • switch-case文
  • 繰り返し文
    • while文
    • do-while文
    • for文
    • for in文
    • for each in文(JavaScript独自拡張)
  • break文
  • continue文
  • return文
  • 例外(throw)

基本的に意味不明で特殊なものはないかな? (for inとfor each inはなんか注意点いっぱいで使うの怖い)

式の種類

文と同じようにまずは列挙して同値演算子だけあとで取り上げます。 式はオペランド演算子に分けられるらしく、 その式を特徴付けるのは演算子なので実質演算子列挙になります!

同値演算子

JavaScriptの同値演算子のやばいポイントは、

  • ==

と、二種類の演算子があることに尽きる。
==だと暗黙の型変換込みでの同値演算子
===だと型も含めて同値であるかの判定を行うらしいぞ!