GENZITSU / UsefulMaterials

34 stars 0 forks source link

weekly useful materials - 06/08 - #102

Open GENZITSU opened 1 year ago

GENZITSU commented 1 year ago

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

PytorchでのAutomatic Mixed PrecisionのON/OFFをコード上で綺麗に制御するためのtips

if / elseを用いずとも以下のように切に書くことが可能

# from https://tawara.hatenablog.com/entry/2021/05/31/220936

model = Net().cuda()
optimizer = optim.SGD(model.parameters(), ...)
scaler = GradScaler(enabled=use_amp)

for epoch in epochs:
    for input, target in data:
        optimizer.zero_grad()

        with autocast(enabled=use_amp):
            output = model(input)
            loss = loss_fn(output, target)

        scaler.scale(loss).backward()
        scaler.step(optimizer)
        scaler.update()

なぜこれで良いか

autocast(enabled=False) subregions can be nested in autocast-enabled regions. Locally disabling autocast can be useful, for example, if you want to force a subregion to run in a particular dtype. ... ということで、enabledパラメータで使用するかどうかを制御可能

Returns scaled outputs. If this instance of GradScaler is not enabled, outputs are returned unmodified.

  • step 実装を見るとわかりますが、enabled=False の時には scaler.step(optimizer) は単純に optimizer.step() をします。

  • update 同じく実装 を見るとわかりますが、enabled=False の時には何もしません

コメント

本家のコードにはenabledがis_enabledとなっているタイポがあったが、とても勉強になった。

出典

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

GENZITSU commented 1 year ago

Recent Deep Learning Links

ここ数年のうちに世間を騒がせた大規模モデルたちのテックブログなどを時系列順にまとめているサイト。 これまでどんなモデルがいて、今どんな流れになっているかをざっくり知ることができる。

スクリーンショット 2022-06-02 22 30 49

コメント

こういうまとめ意外と助かる。

出典

Recent Deep Learning Links

GENZITSU commented 1 year ago

フェイクニュース検出データセットにおける通時的バイアス

フェイクニュース検出データセットに存在する作成時期のバイアスを緩和するための手法の提案 @ ANLP2021

フェイクニュース検出データセットはその特性上、特定の人物や事象に対するニュースが多くなってしまうため、それらの単語が入っているだけでフェイクと判定されてしまう危険性を孕んでいる。

いかのように、人名はフェイクニュースに対してかなり高い相関があることが確認されている。 スクリーンショット 2022-06-02 22 38 07

ちなみにLMIとはこれ

スクリーンショット 2022-06-02 22 39 23

これを緩和する手法として以下を検討

以下が実験結果で、残念ながら同ドメインでの検証だと何もしないLexicalizedが最も性能が高い スクリーンショット 2022-06-02 22 45 48

しかし別ドメインへでのテストデータで比較を行ってみると、WikiDやNEDeletionなどの手法が有効であることが確認された。

スクリーンショット 2022-06-02 22 45 57

Celebrityでは効果が振るわなかった理由は下記

一方で,芸能系のドメインである Celebrity をテストデータとしたとき,Lexicalized と変わらない検 出精度であった.これは,学習データが政治系を中心としたものでドメインが大きく異なることから,Wikidata を活用できず大きな効果が見られなかった

コメント

フェイクニュース以外の話でも、通時性をもつ自然言語処理に対しては同様のバイアス除去が役に立ちそうな気がする。

出典

フェイクニュース検出データセットにおける通時的バイアス

GENZITSU commented 1 year ago

画像を全部Lennaにして異常検知を行った話

全ての画像をLennaさんに変換することで、綺麗に変換できないもは異常であると判断する狂気じみた異常検知手法が発表された。

代表的な手法

提案手法

スクリーンショット 2022-06-02 22 58 41

全ての画像をLennaさんにするように学習させるため出力の多様性が少ない & 生成誤差の算出が楽。

結果

意外と精度がでるらしい。

スクリーンショット 2022-06-02 23 01 22

コメント

多分、画像として全く違わないとうまくいかない気がするが、アイデアとしては面白い。

本題とは関係ないが、Lennaさんの画像を使うのはもうあんまり良くないはずなんだが、論文の題材にしてよいのでしょうかね...

出典

GENZITSU commented 1 year ago

ConvNeXtを小さい画像に適用する

ConvNeXtを32x32の極小画像に対しても高精度が出るようにどのように改造して行ったかが綴られている記事。

224x224(imagenet size)用と思われるstride, kernel_size, downsamling, 前処理の統計量などを32x32(CIFAR10)用に改造していくことで、高精度を達成。

convnextとは?

VisionTransformer並みの精度をcnnでも達成できるよとして、一世を風靡しているモデル。

スクリーンショット 2022-06-02 23 20 35

ただし、こいつだと32x32の画像に対する分類があまりうまくいかなかったとのこと

スクリーンショット 2022-06-02 23 22 56

改良①: stemのカーネルサイズ変更

kernel sizeというよりstride4のせいで特徴マップが縮みすぎるということで変更

# from https://pystyle.info/pytorch-resnet/

変更前:
stem = nn.Sequential(
        nn.Conv2d(in_chans, dims[0], kernel_size=4, stride=4),
        LayerNorm(dims[0], eps=1e-6, data_format="channels_first")
)
変更後:
stem = nn.Sequential(
        nn.Conv2d(in_chans, dims[0], kernel_size=3, stride=1, padding=1),
        LayerNorm(dims[0], eps=1e-6, data_format="channels_first")
)

スクリーンショット 2022-06-02 23 27 21

改良②: convブロックのkernel size変更

これも7は流石にやりすぎということで変更

# from https://pystyle.info/pytorch-resnet/

変更前:
self.dwconv = nn.Conv2d(dim, dim, kernel_size=7, padding=3, groups=dim) # depthwise conv
変更後:
self.dwconv = nn.Conv2d(dim, dim, kernel_size=3, padding=1, groups=dim) # depthwise conv

スクリーンショット 2022-06-02 23 28 31

改良③: downsamplingのカーネルサイズ変更

# from https://pystyle.info/pytorch-resnet/

変更前:
downsample_layer = nn.Sequential(
        LayerNorm(dims[i], eps=1e-6, data_format="channels_first"),
        nn.Conv2d(dims[i], dims[i+1], kernel_size=2, stride=2),
)
変更後:
downsample_layer = nn.Sequential(
        LayerNorm(dims[i], eps=1e-6, data_format="channels_first"),
        nn.Conv2d(dims[i], dims[i+1], kernel_size=5, stride=2, padding=2),
)

スクリーンショット 2022-06-02 23 29 40

改良④: 要約統計量の変更

imagenetの統計量からCIFAR10の統計量に変更

スクリーンショット 2022-06-02 23 30 45

実タスクでの評価

スクリーンショット 2022-06-02 23 31 12

コメント

データセントリックな時代にアーキテクチャーの改良を実施し、実際に結果を出しているのがすごい。
データ、データ言われる時代ですが、ある程度データが集まった先はやはりアーキテクチャーの探索をしていかないといけないんだなぁと感じた。

出典

ConvNeXtを小さい画像に適用する

GENZITSU commented 1 year ago

6D Rotation Representation for Unconstrained Head Pose Estimation (Pytorch)

角度によらず顔の角度推定を行うことができるモデルのコードとweightsが公開、AFLW2000とBIWIというデータセットでSOTAを20%ほど改善したとのこと。

スクリーンショット 2022-06-03 10 50 23

手法の肝としては、

スクリーンショット 2022-06-03 10 55 55

角度推定を行う際にはEuler角やquaternionなどを教師データとして利用することが可能だがそれぞれ課題がある。

そこで曖昧性が生じない3x3の回転行列を推測させに行くことが考えられるが、回転行列にはR RT = Iとなるような制約があり、これを取り込む必要が出てくる。

そこでグラムシュミットの直行化にinspireされた方法で3x3ではなく3x2の行列を求めてにいくこととした

スクリーンショット 2022-06-03 11 05 19

3x2 → 3x3への変換は下記のように実施できる

スクリーンショット 2022-06-03 11 05 35

また、3x3の行列同士を比較する際にMSEを使ってしまうと、3次元多様体の制約を無視してしまいがちなので、以下のようなロスを提案

スクリーンショット 2022-06-03 11 08 47

backboneの上に何をつけるかについてはsingleのMLPが良かったとのこと

As groundwork for this choice, we tested multiple configurations for the final layers, including one layer up to three sequential fully connected layers, single final layers with 6 output neurons, and separated branches with one output neuron each. In our experiments, a single final layer with 6 output neurons

結果

スクリーンショット 2022-06-03 11 10 24

スクリーンショット 2022-06-03 11 11 55

スクリーンショット 2022-06-03 11 12 05

コメント

あえてパラメータを増やすことで、full rangeの角度推定を曖昧性なしに行うことができるというのは面白い発想。

ちなみにオイラー角⇆回転行列の変換はこのブログが詳しい

スクリーンショット 2022-06-03 11 18 41

出典

GENZITSU commented 1 year ago

姓名分割ライブラリNameDividerのv0.2.0がリリース

v0.2.0になったことで、精度が99.2→99.9へ向上

FT6ql2LUAAAlwvC

# from https://github.com/rskmoi/namedivider-python

from namedivider import BasicNameDivider, GBDTNameDivider
from pprint import pprint

basic_divider = BasicNameDivider() # BasicNameDivider is fast but accuracy is 99.2%
divided_name = basic_divider.divide_name("菅義偉")

gbdt_divider = GBDTNameDivider() # GBDTNameDivider is slow but accuracy is 99.9%
divided_name = gbdt_divider.divide_name("菅義偉")

print(divided_name)
# 菅 義偉

pprint(divided_name.to_dict())
# {'algorithm': 'kanji_feature',
# 'family': '菅',
# 'given': '義偉',
# 'score': 0.7300634880343344,
# 'separator': ' '}

コメント

すごい

出典

GENZITSU commented 1 year ago

DataFrameからサンプリングしたあとの残りが欲しい時の話

表題の通り。

df.dropがindexも受け付けるので以下のようにすれば良い

# from https://ensekitt.hatenablog.com/entry/2018/05/30/200000

df_not_sample = df.drop(df_sample.index)
df_not_sample

コメント

最近似たようなことをやりたい時があったので助かった。

出典

DataFrameからサンプリングしたあとの残りが欲しい時の話

GENZITSU commented 1 year ago

因果推論における変数選択

回帰モデルの係数を推定する際に、より正確な推定値を得るために様々な選択方法を検討している記事。

変数選択しない場合

スクリーンショット 2022-06-07 22 52 38

Lassoを用いて変数選択する場合

スクリーンショット 2022-06-07 22 53 04

Double selectionを用いる手法

スクリーンショット 2022-06-07 22 53 35

スクリーンショット 2022-06-07 22 53 40

Rigorous Lasso

スクリーンショット 2022-06-07 22 54 14

Double Machine Leaning & Honest Learning

スクリーンショット 2022-06-07 22 54 39

スクリーンショット 2022-06-07 22 54 45

スクリーンショット 2022-06-07 22 54 54

一覧表

今回は100件程度しかデータを生成していないことに注意

スクリーンショット 2022-06-07 22 55 42

コメント

聞いたことがない手法ばかりで大変勉強になった。

出典

因果推論における変数選択

GENZITSU commented 1 year ago

積読メモ:『AIエンジニアのための機械学習システム デザインパターン』を読んだ

表題の通り、特にためになったものだけ抜粋

パート1

  • MLでは再現性のある学習が必要。再現性で求められることは、自分以外の人間が同じデータと同じ学習コード、同じアルゴリズムとパラメータ、同じライブラリとバージョンで学習を実行し、自分と大差ない結果を得ることができること。
  • 推論結果から、アクションをおこす必要のある関係者やステークホルダーを含めて受け入れ試験をするのがよい。
  • 推論結果が社内プロセスに組み込まれ、人間の介入が必要になる「ヒューマンインザループ」のワークフローを作ることがある。この場合は、人間の作業が可能な範囲で実施する設計にするべき。例えば、すべてを専門家が確認するプロセスは破綻する。
  • ヒューマンインザループのプロセスの場合、人間がタスクを実行可能でない量の推論では、ビジネスにネガティブな影響を与える可能性さえある。
  • 推論器の評価には、システムとしての「リリース判定」が必要。

パート2

  • モデル開発と本番システム(推論)で共通のOS、言語、依存ライブラリのバージョンをそろえて開発する。
  • 学習に利用したデータも管理する。評価時に、学習済みのデータを使ってしまい、正当に評価されていないモデルがリリースされるリスクがある。
  • OS、ライブラリ、バージョン、稼働モデル、入力データ形式、モデルの目的は一元管理する

パート3

  • 推論を視覚化するダッシュボードなどを用意すると便利
  • 機械学習システムが正常であるというためには、推論が正常に動作する(学習時と同様のパフォーマンス)ことと、推論器自体が正常に動作する(レイテンシーや可用性がサービスレベルを保持)が求められる。

コメント

心に留めておきたい

出典

GENZITSU commented 1 year ago

Webエンジニアに知ってほしいRDBアンチパターン

表題の通り。

気になったところだけ抜粋

バックアップについて

バックアップとレプリケーションは全く異なる

スクリーンショット 2022-06-07 23 33 11

スクリーンショット 2022-06-07 23 30 16

スクリーンショット 2022-06-07 23 32 56

スクリーンショット 2022-06-07 23 32 41

スクリーンショット 2022-06-07 23 33 22

制約について

様々な理由で制約を使わない誘惑かられてしまうが、ひどい未来が待っている

スクリーンショット 2022-06-07 23 35 35

スクリーンショット 2022-06-07 23 35 12

ロックについて

スクリーンショット 2022-06-07 23 37 19

スクリーンショット 2022-06-07 23 37 36

スクリーンショット 2022-06-07 23 37 54

スクリーンショット 2022-06-07 23 38 08

スクリーンショット 2022-06-07 23 38 39

コメント

業務でDBいじることほぼないけど気をつけたい。

出典

Webエンジニアに知ってほしいRDBアンチパターン