俵言

しがない社会人が書く、勉強とかのこと。最近は機械学習や kaggle 関連がメイン。

小ネタ:Pytorch で Automatic Mixed Precision (AMP) の ON/OFF をするときの話

最近気付いたのでメモ。長くなってしまったので、結論だけ見たい場合はまとめまで読み飛ばしてください。

まえおき

NN を学習する際の GPU メモリの使用量軽減や学習速度の向上手段として混合精度学習(Mixed Precision Training) は欠かせません。pytorch では torch.cuda.amp モジュールを用いることでとてもお手軽に使うことが可能です。

以下は official docs に Typical Mixed Precision Training と題して載っている例ですが 、 model の forward と loss の計算を amp.autocast の with 文中で行い、loss の backward と optimizer の step に amp.GradScaler を介在させています*1

*1:おそらく簡単のために input と target を gpu device に送る部分などが省略されているので注意

続きを読む

Twitterスペースで作業通話してみた

気にはなりつつもしばらく放置してたんですが、ちょっと使ってみたので雑感。
非常にお手軽な一方で Meets とかで作業通話するよりもずっと Open なので慣れが必要な感じがしました。

結構楽しかったのでそのうちまた立てたいですし、他の人のやつにも入ってみたいですね。

色々な意味でお手軽

  • 諸々が Twitter で完結しているため部屋を立てるのも入退場もスムーズ
  • 仕様上誰でもリスナーとして入れる&誰が部屋に居るのかわかるため、知り合いの Tweet に貼られた meets 等のリンク*1とかよりも圧倒的にハードルが低い

誰に雑談相手になってもらうか問題

  • 発言権は部屋を立てた人(host)が管理しており、基本的に speaker は host が指定する*2
    • 承諾するかはあくまで listener の自由意志
    • テーマを決めない作業通話だと予め決まった相手がいない場合が多そうなので speaker になってくれる人が来るかは賭け*3
  • listener も「しゃべりたい」と挙手出来るが、(少なくとも僕は) 知り合いで無い人を承諾するのにかなり躊躇いがあった
    • 多分スタンス次第。知り合いでない人に躊躇なくリプを送れるかみたいな。
    • 予めスペース名に「speaker は知り合いに限定」とか「相互フォロー限定」と書いとくと良さそう

「何かしゃべらなきゃ」ってちょっと思っちゃう問題

  • 気づいたら listener が増えててちょっとビビる*4
  • 作業通話なのに「(host として)無言の時間は良くないのかな」ってちょっと思っちゃう
    • listener は勝手に聴きに来てるだけなので慣れたら気にならなくなりそう
    • これも スペース名に書いとくと親切かも
  • 最後の方のほぼ speaker しかいない状態が一番気楽だった

要望

  • チャット対応
    • 現状だと数種類のスタンプが押せるだけ(しかもその人のアイコンに一瞬出るだけなので作業してる状態では全く気付かない)
    • listener とのやり取りが容易になるので色々捗りそう
  • PC版/ブラウザ版への対応
    • PC で作業してるので speaker の承諾やらなんやらをするためにスマホを見るのが面倒
    • 通話だけがメインならスマホでも良いのかも
  • listener の制限機能
    • 知らない listener が沢山いるとちょっと気を遣ってしまうので
  • 負荷の軽減
    • 特に iOS 勢から「重い」「スマホが結構熱くなってる」というコメントあり

その他

  • テーマを決めてしゃべるイベントも楽しそう
    • LT イベントのもっと簡易版
    • 資料を用意しないで良いという意味で非常に楽
  • コンペ終了後に超雑に反省会するとかもあり

*1:ある程度仲良くないと入りにくいですよねって話

*2:全員に最初から発言権を与える設定もあるらしい:https://help.twitter.com/ja/using-twitter/spaces

*3:来なかったら即終了ぐらいのスタンスでいいのかも

*4:一番多い時で30人弱

感想文:Pythonトリック ~真に効果的なPythonプログラミング手法~

最近全くブログを書いてないのでリハビリとして読書感想文を書くことにしました。よくよく考えると本をちゃんと全部読み切ったのもかなり久々かも。

最近まで「Kaggle!」「機械学習!」みたいなテンションを続けていたのに少し疲れてしまった感があり、こう、すぐ役立つかわからないけど興味本位で基礎的な知識を入れるという行為をしたくなったんだと思います*1

読んだ本

Pythonトリック

Pythonトリック

  • 作者:Dan Bader
  • 発売日: 2020/04/15
  • メディア: 単行本(ソフトカバー)

去年の4月に発売された本です。その少し前に出た 自走プログラマー ~Pythonの先輩が教えるプロジェクト開発のベストプラクティス120 と一緒に買ったのですが、気づけば積んだまま一年経ってました😇

あらゆる場面で活躍するプログラミング言語Python。 本書はそんなPythonをマスターし、日々のプログラミングに活用したい熱心な方々のための1冊です。

入門書を一通り終えた駆け出しプログラマには、Pythonの機能や特徴をより深く、 また他言語から新たにPython習得を目論むベテランには、コードの書き方の差異を、 リスト内包や文字列フォーマットなど、さまざまなサンプルを元に教授してくれます。

著者のDan Baderは、Twitterでのアウトプットに端を発する、いわゆるTips紹介の延長線上で、この本を執筆しました。 そのため、各種Tipsに対するさまざまなフィードバックと、よりよく伝えるためのアイデアが盛り込まれ、 結果、Pythonをより深く知り、より良いコードを書くための知識が集積された書籍となりました。

つまり本書は、もっとすごいPython開発者になりたいあなたを、 強力にサポートする1冊です。

雑に内容紹介すると、細かいけど知っておくと役に立つ tips や、Python 上級者たちが使いこなしているであろう強力な機能、仕様に一歩踏み込んだ Python 知識を集めた本です。長年 Python を使っている割に使いこなしている気になれない僕にはちょうど良い本だったのかなと思います。

対象読者

本文中でも明言されているのですが、この本は Python をある程度使っている Pythonista がレベルアップするための本という位置づけです。初心者がいきなりこの本を読むのはかなりハードルが高く、その場合は別の本を読んだ方が良いと思います。

一方で、以下の目次を読んだときに「人のコードで見たことあるけど使い方はよく知らないな」「使ったことあるけど仕組みをよくわかってないな」ってなる人にはかなりお勧めしたい本です*2

CHAPTER 1 はじめに

1.1 Pythonトリックとは何か

1.2 本書はどのように役立つか

1.3 本書の読み方

 

CHAPTER 2 よりクリーンなPythonのためのパターン

2.1 アサーションによる安全対策

2.2 無頓着なコンマの配置

2.3 コンテキストマネージャーとwith文

2.4 アンダースコアとダンダー

2.5 文字列のフォーマットに関する衝撃の事実

2.6 「The Zen of Python」の隠しコマンド

 

CHAPTER 3 効果的な関数

3.1 Pythonの関数はファーストクラスオブジェクト

3.2 ラムダは単一式の関数

3.3 デコレータの威力

3.4 *argsと**kwargs

3.5 引数のアンパック

3.6 ここから返すものは何もない

 

CHAPTER 4 クラスとオブジェクト指向プログラミング

4.1 オブジェクトの比較:”is”と”==”

4.2 文字列変換:すべてのクラスにreprが必要

4.3 カスタム例外クラスを定義する

4.4 趣味と実益を兼ねたクローンオブジェクトの作成

4.5 抽象基底クラスは継承に待ったをかける

4.6 名前付きタプルは何に役立つか

4.7 クラス変数とインスタンス変数の落とし穴

4.8 インスタンスメソッド、クラスメソッド、静的メソッドの謎を解く

 

CHAPTER 5 Pythonの一般的なデータ構造

5.1 ディクショナリ、マップ、ハッシュテーブル

5.2 配列

5.3 レコード、構造体、DTO

5.4 セットとマルチセット

5.5 スタック(LIFO

5.6 キュー(FIFO

5.7 優先度付きキュー

 

CHAPTER 6 ループとイテレーション

6.1 パイソニックなループの書き方

6.2 内包を理解する

6.3 リストのスライスとすし演算子

6.4 美しいイテレータ

6.5 ジェネレータは単純化されたイテレータ

6.6 ジェネレータ式

6.7 イテレータチェーン

 

CHAPTER 7 ディクショナリのトリック

7.1 ディクショナリのデフォルト値

7.2 趣味と実益を兼ねたディクショナリのソート

7.3 ディクショナリを使ってswitch/case文をエミュレートする

7.4 型破りなディクショナリ式

7.5 ディクショナリのいろいろなマージ法

7.6 ディクショナリの出力を整える

 

CHAPTER 8 パイソニックな生産性向上テクニック

8.1 Pythonのモジュールとオブジェクトを調べる

8.2 仮想環境を使ってプロジェクトの依存関係を分離する

8.3 バイトコードの裏側を覗く

 

CHAPTER 9 最後に

9.1 Python開発者のためのメールマガジン

9.2 PythonistaCafe:Python開発者のコミュニティ

おすすめポイント

個人的にとてもありがたかったのは コンテキストマネージャー、デコレータ、yield 文 が解説されていたことでした。これらは僕の中の「見たことあるけど使いこなせてない Python の機能ランキング」top10 に間違いなく入る機能達*3ですが、この本を読んだことで初めて使い方を理解できた気がします。

Python の基礎知識を深める内容としては、関数がファーストクラスオブジェクトである点、クラスの一歩踏み込んだ理解、データ構造の比較 あたりもおすすめです。ここら辺の内容は結構知っている部分も多かったのですが、改めてまとまった説明を読むと再発見があって楽しく読めました。

Tips としては アンダースコアの意味、引数のアンパックあたりが意外と知られてないことがある気がします。また、個人的にはイテレータチェーンでパイプラインを作る話がとても衝撃的で、イテレータへの理解が深まった気がします。

全体としては、各項目について簡単な例でわかりやすく説明していることと、ユースケースや著者のベストプラクティスが記載されているのが良い点だと思っています。機能を沢山紹介されるとどれを使っていいのか迷いがちなんですが、そこに関してもアドバイスがあるのはとてもありがたいです。

おわりに

書きすぎると本の中身をそのまま紹介しそうなのでここらへんで筆を置きます。

僕のように目次の中に「見たことあるけど使いこなせていない機能」がある方は是非とも読んでいただきたいです。ページ数も200ページとそんなに多くなく、Python をある程度使える人がステップアップする取っ掛かりとしてはとても良い本なんじゃないでしょうか。

僕もこの本を読んだことで Python の知識を深めたい欲が増してきたので、次は積んでいる Fluent Python をちょっとづつ切り崩していきたいです。目指せ 玄人 Pythonista !

Fluent Python ―Pythonicな思考とコーディング手法

Fluent Python ―Pythonicな思考とコーディング手法

  • 作者:Luciano Ramalho
  • 発売日: 2017/10/07
  • メディア: 単行本(ソフトカバー)

*1:「いや機械学習Python 使ってますやん」という突っ込みは脇に置いておく

*2:僕は「見たことあるけどよくわかってないな」と感じる項目があったのでとても役に立ちました

*3:Twitter 等でアンケート取っても上位に来る気がします

黒魔術への招待:Neural Network Stacking の探求

この記事は Kaggle Advent Calendar 2020 の16日目の記事です。去年ネタ記事*1を書いたので今年は真面目なやつにしました。

はじめに

 Kaggler はコンペにおいてあらゆる手段を用いて評価指標の改善を目指します。特徴量エンジニアリング、モデルや学習手法の試行錯誤、特殊な前処理・後処理の考案、はたまた Leakage の利用に至るまで、ルールを破らない範囲であれば何でもする*2のが Kaggler です。今挙げた例はそのコンペ固有の性質(データの生成過程・分布、評価指標、... etc.)に着目することで大きな効果をもたらす場合が多いのですが、一方でいずれのコンペにおいても一定の効果が得られる手法があります。それは複数のモデルの予測結果を統合して予測を行う Ensemble です。Ensemble は統合するモデルに多様性があるほど性能が向上すると一般に知られており、(別々のやり方で)競い合っていたライバル達とチームマージして順位を一気に伸ばす参加者もしばしば見受けられます。このため、コンペ終盤にメダルの border が一気に上がって参加者が苦しむのも Kaggle でよく見られる光景です。
  記事のタイトルにも入っている Stacking は、大雑把に言うと Ensemble の中でも各モデルの予測値を特徴量として新たなモデルを学習させる手法のことを指します。過去コンペの solution*3*4 で行われた Stacking の複雑さから†黒魔術†なんて言われたりもしますね。注意深く扱わないと local data に overfit して大惨事(Big Shake Down)になりかねませんが、時に強力な決め手ともなり得る手法だと考えています。 (Stacking の詳細や注意点については Kaggle Ensembling Guide*5 や Kaggle 本*6 の "7章 アンサンブル" をご覧ください。)

 本記事では Stacking の中でも比較的新しい部類である(と僕が勝手に思っている) Neural Network を用いた Stacking をいくつか紹介し、特に Stacking するのが面倒な Multi-Label Classification のタスクで比較検討して行きます。


この記事が参考になりそうな方:

  • NN の扱いをある程度心得ており、学習・推論が一通りできる Kaggler
  • 仕組みとか気にしないのでとにかく score を上げたい Kaggler
  • NN を用いた Stacking に興味がある Kaggler

この記事を読まない方が良いと思われる方:

  • Kaggle 初心者、もしくはこれから Kaggle 始めたいって方 (闇に魅入られてはなりません)
  • Stacking の理論的な部分に興味がある方(僕は気分でやってるだけなので何もわかりません...)
  • Ensemble は甘えだと思っている玄人 Kaggler (精進するので許して...)

目次

  • はじめに
  • Stacking を Neural Network でやると何が嬉しいの?
  • 使用する Competition Data
  • Stacking に使用する Model
    • MLP
    • 1D-CNN
    • 2D-CNN
    • GCN
  • 結果
    • Stacking 元の Model の Score
    • 各 Stacking Model の Score
    • Take Me Higher
  • 終わりに
  • 付録
続きを読む