のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

学びの多いCA × atmaCupに参加して11位でした

皆さんこんにちは
お元気ですか。私は珍しく、結構疲れました。

先日の1/25(土)ですが、CA × atmaCupに参加してきました。
私としては初のオフラインコンペに参加し、senkinさんとチームを組み、結果はPublic 4th/Private 11thでした。
※コンペの守秘義務的に情報公開が難しいところがあるので、詳細は割愛します。

f:id:tereka:20200127222406p:plain
Private Leader Board

コンペ中何していたか。

いつもどおり(?)ニューラルネットワークの記述をメインに進めていました。そして、最後1hはアンサンブルを実施しました。
lightgbmでソリューションを実装しなかった理由は、私にlightgbmのノウハウが少なく、短時間で実装できるスキルがまるでなかったためです。
Home Credit以来、lightgbmから離れすぎて頭抱えてました。

特徴量を取り出すのに難航するレベルだったのは自分でも驚きです。

参加してどうだったか

コンペ編

事前準備は必要です

実装時間が大体8時間、もちろん計算時間もいるので更に減りますがとにかくが勢いが必要です。
そのため、勢いを生み出しながらソリューションを考えるには、事前準備に時間を取り、スクリプトを書いておかないと、特徴量を考える時間やバグを生みます。
やはり、可能な限りお決まりのスクリプトを作っておくのが良かったと反省しております。
(前日まで酒飲みすぎて作れなかった。。)

良い意味でとても疲れた

8時間もフルに頭を使う機会はそうないでしょう。
あれはだめ、これもダメといった実試行錯誤のスピードをいつもより高速にしていたので疲れました。
終わった後全力を出し尽くした感があり、非常に満足感のあるコンペだったように思えます。

その他

コンペ中の雰囲気

コンペ中の雰囲気は静かすぎて、音がなるとうるさかったり、チームメンバと話す声の音量にかなり配慮が必要なぐらいです。
かなり集中しているので、自分も頑張らないとと思って、頑張ってました。

終わってからの感想戦

コンペの順位が発表されてからすぐに上位ソリューションインタビュー&懇親会です。
オフラインコンペをそのままの熱で参加者と話せるので忘れないうちにあれやったこれやったのようなことを話せるのが良かったです。
そのため、とても学びが多かった

最後に

主催してくださっているatmaさん、サイバーエージェントさん、チームを組んでくださったsenkinさん
そしてお会いした皆さん、ありがとうございました!
とっても楽しかったです!
次回のコンペも(東京開催があれば・・)参加するつもりですので、またお会いしましょう!

新しい布団を購入して快適になった話

皆さんこんにちは
お元気ですか。私は布団で感激です。

さて、本日は布団について、執筆しようと思います。
昨年度まで安値の掛ふとんと敷布団を利用していましたが、寒くなり辛かったです。

自宅の都合上2つの問題がありました。

  1. 掛ふとんの中が端によりすぎることが多く、掛ふとんとしての機能を失っている。一言で言えば寒い。
  2. PCが2台(GTX1080Ti/RTX2080Ti)あるため、ブレーカーが心配。暖房つけれない。

で、この問題は継続するとパフォーマンスに響き、流石に厳しいということで、今年はなんとしても布団を購入したいといったモチベーションがありました。
そこでニトリに直接いって見つけた掛ふとんと敷布団がありそれを購入しました。

結果的には成功だったので、まぁ良かったです。

購入における基本方針

一言で言えば、高くても良いものを選択するです。
基本的には数年〜10年単位で使えるものだと思っています。
高くても暖かく、快適な眠りを獲得すれば、仕事やKaggleで取り返せるため投資対効果は高いと感じていました。

掛ふとん

まず、掛ふとんはニトリのかるふわと呼ばれるシリーズから選択しました。
温かいのが良かったので少なくとも、あたたかさLV5にしたかったというのがあります。
更に、その場で触っても偏りがなかったこともあり、これだ!と感じていました。

後は値段とのご相談ぐらいで確か3万円前後のを選択しました。明確に覚えていませんが確かこのあたり。
(同じ値段のがないので正確にはわからず・・・すみません。)

実際に購入しての感想ですが、満足です。
一言で言えば、かなり暖かくて感動しました。今までのように布団が偏ることはもちろんなく
ふわっふわ、かつ、軽い布団で生活をエンジョイしています。

敷布団

敷布団はどちらかといえば最初は興味本位です。
安値とはいえど、そこまで困ってはいませんでした。

で、いくつかの選択肢の中で快適そうなものがあったのでそれを購入しました。

実際に寝心地はよく、凸凹していないと落ち着かなくなりました。
かなり睡眠が安定しています。前の敷布団よりも快適なのは素晴らしいですね。

最後に

計6万ほどしましたが、非常に投資対効果の良い買い物をしたと感じています。
寝具安くても良いといっている方もいるとは思いますが、やはり高いものには高いなりの理由があります。
そのため、余裕が少し出てきたら良いものの購入を検討するのが望ましいと感じました。

これからはじめるGo言語(インストールと開発環境構築)

皆さんこんにちは
お元気でしょうか。私は元気です。

久々に別の言語を習得したいと思って勉強をはじめようかと、思いました。
そう、ISUCONでのユーザが多いGo言語です。

Go言語とは

プログラミング言語の一つで、2009年にGoogleで設計された言語です。
この特徴は次の通りです。

1. コンパイルがある言語
2. 実行時の性能が良い。
3. メモリの安全性
4. スレッドレベルでの並列実行

特にWebサーバやCLIツールなどで利用されることが多くなっており、注目度の高い言語の一つです。

golang.org

インストール&サンプル実行

インストール方法

公式から

golang.org

その他
brew install go

また、仮想環境を利用される方は「仮想環境構築」の章の内容を元に構築してください。

サンプル実行

試しにインストールしたgoを実行しましょう。
次のソースコードを「hello.go」で保存してください。

package main

import "fmt"

func main() {
  fmt.Println("hello go!")
}

そして、次のコマンドでgoを実行しましょう。

go run hello.go

仮想環境構築

仮想環境(Pythonだと、pyenv)により複数バージョンのgo言語を管理できます。

インストール

github.com

Macの場合だと次のとおりです。

brew install goenv

次の内容を.bash_profileに書き込み、sourceなどで再読込しましょう。

export PATH="$HOME/.goenv/bin:$PATH"
eval "$(goenv init -)"

goenvでGo言語をインストールする

Go言語のインストールは次の通り。1.11.4はバージョンを示します。

goenv install 1.11.4

因みに、インストール可能なバージョンは次で確認可能です。

go versions

そして、インストールしたバージョンを利用するには、次のコマンドを利用します。

goenv global 1.11.4
goenv rehash

切り替わったかどうかはこのコマンドを使って確認できます。

go version

開発環境構築

Visual Studio CodeVSCode

今回はVSCodeに環境を構築します。
VSCodeが入っていない人は次のサイトよりインストールしましょう。

code.visualstudio.com

Pluginのインストール

goのプラグイン(名前もそのまま)を入れれば、補完機能なども使えるので便利です。

f:id:tereka:20200112112600p:plain
goのプラグイン

VSCodeからは、Terminalで実行するか、もしくは、Pluginの「Code Runner」を使えば、VSCode上で実行できます。

最後に

最近新しい言語を勉強していなかったので新しい気持ちでGoを勉強してみたいと思います。

画像を混ぜ合わせるData Augmentationの紹介

皆さんこんにちは
お元気でしょうか。冬寒いです。いい布団ほしい。

さて、本日は画像を混ぜ合わせる系のData Augmentationを紹介します。(CutOut含む)
画像を回転、拡縮、平行移動させるのはよく知られている手法でしょう。

ただし、CutOut、Mixupを筆頭に、画像のコンテキストそのものに加工したり、混ぜ合わせたりする手法も時折使われるようになってきました。
その手法に関して、本記事では紹介していきます。

Data Augmentationの手法の紹介

CutOut

arxiv.org

有名な手法の一つであるCutOutです。
学習中に正方領域をマスクすることにより、頑強性(robustness)を獲得し、精度が向上しました。
シンプルな手法ではありますが、当時のSoTAを獲得しています。

※実装
github.com

Random Erasing

arxiv.org

画像に対する新規のData Augmentationです。
過学習(Overfitting)の軽減やオクルージョンによる影響を抑えられます。
画像から一定の領域を抽出し、その箇所にランダムで与えた数値で塗りつぶす処理をします。

言葉で説明するよりも、論文にある例を見てもらったほうがわかりやすいと思います。

f:id:tereka:20200104174513p:plain:w500
Random Erasingの例

論文中の実験だとCIFAR-10、CIFAR-100やFashion MNISTでRandom Erasionなしの場合より高いスコアを出しました。

Mixup

arxiv.org

2つの画像を合成して新しいサンプルを作成する手法です。
モデルの学習時にはラベル側も混ぜ合わせる必要があります。
この画像の合成の結果により、正則化の効果が生まれ、かつ、画像の中間も識別できるようになるため、精度が向上すると言われています。
中間の識別は次のイメージです。緑が0, オレンジがクラス1, xが入力された場合(=事前条件)の緑の確率です。
右側がMixupになりますが、徐々に青色がなくなっていく様が見られます。

f:id:tereka:20200105224713p:plain:w400
Mixupのイメージ

※実装
github.com

RICAP

arxiv.org

RICAPの手法の正式名称はrandom image cropping and patchingです。
RICAPはMixupに似ていますが、4枚の画像をくり抜き、合成する方法です。
CutoutやMixupと比較して、RICAPの方が精度が高い結果となりました。

f:id:tereka:20200105225534p:plain:w400
RICAPの画像生成(論文より)

(ただ、個人的にうまくいった覚えはない。)

※実装
github.com

CutMix

arxiv.org

最初に紹介したCutoutの改良版です。
画像を2枚用意し、一つの画像からもう一つの画像へコピーします。
この手法を使うことで、画像分類のみならず、物体検出でも精度向上を達成しました。
従来まで行われていた領域の欠如を行う手法(Random Erasing/Cutout)は学習に必要な情報を削り、非効率になるため、その改善を図ったそうです。

f:id:tereka:20200105230342p:plain:w400
CutMixの例

※実装
github.com

AugMix

arxiv.org

こちらが最近出たData Augmentation手法です。
複数の変換をかけた画像を最後に混ぜ合わせる手法です。
Augmixは学習とテストのデータに異なるときにも精度が伸ばす工夫がされており、未知のデータにも強い方法です。
本手法のイメージは、次の画像を見るとわかりやすいと思います。

f:id:tereka:20200105232907p:plain:w500
AugMixの方式(論文)

※実装
github.com

所感

この手の手法はKaggleの画像コンペでは殆どといっても良いほど利用・検討されるものです。
ImageNetのように、画像中にそれなりに被写体が写っている場合だと一部が異なっていてもそれなりに学習できます。
しかし、判定に一部分しかない場合だと判定するための情報がそのまま欠けてしまいうまく学習できないこともありました。

ドメインによってこの部分は影響するのでデータの特性を見て、適用できるか検討する必要があるでしょう。
AugMixはまだ実験していないので、ちゃんと精度が上がるか検討・実験の余地があります。

最後に

結局のところ、最新がベストではなさそうなので、考えて、試して合うのを見つけましょう。
では。

2020年の目標とやりたいこと

皆さんあけましておめでとうございます。
今年もよろしくお願いします。

さて、本年やりたいことを書き連ねたいと思います。

Kaggle

昨年はKaggleに何度も挑みましたが、銀か銅しか取れず、金が0枚といった
結果について鳴かず飛ばずな一年だったと感じています。
昨年よりもソロも多かったのですが、チームでも獲得できなかったところを考えるとまだまだ実力を磨く必要はあると思っています。

今年はGMになるために金3枚(ソロ含む)を目指して完走したいと思っています。

ブログ

Kaggleの方は比較的頑張ったのですが、今年それ以外の活動が疎かになっていたと思っています。
ブログの更新も最近滞っていたので、今年はKaggleで得たものや論文の紹介、或いは便利なツール使ってみたなど
発信をしていけたらと考えています。

12回の更新、月1度ずつぐらいを目指します。
ただ、コンペの状況を考えるとまとめてどこかにかもしれないなぁと思いつつ新年ぐらいこれやるぞと思ってやります。

勉強会&発表活動

今年はCV勉強会への参加や発表がメインになっていました。
ただ、発表も2回と例年と同等ぐらいです。
ただ、あまり活動範囲に進展がないので、今年はPyConJPのCFP通したい(なかなか通らない)など、他にもう少し本腰入れて挑戦したいと思っています。

その他

活動内容が固定化しつつあるので、今年は今までよりもステップアップするために活動範囲を増やしたいとも思っています。
様々な挑戦を考えていきたいと思いますが、お会いした際にはお声がけいただけると幸いです。

最後に

今年1年も皆さんよろしくお願いします!