GENZITSU / UsefulMaterials

34 stars 0 forks source link

weekly useful materials -08/03- #63

Open GENZITSU opened 3 years ago

GENZITSU commented 3 years ago

BERTで英検を解く

2021年第1回の英検の問題を各級から10問取得して、BERTでといてみた記事。

BERTによる

結果はこんなこんな感じで、peplexityが一番良い

スクリーンショット 2021-08-04 20 33 24

コメント

perplexityの比較というアイデアは面白い。
コードも充実しているので、覗いてみたい。

出典

元記事
kernel
git

GENZITSU commented 3 years ago

Lean AI 開発論: コードを書く前に機械学習プロジェクトを評価する方法

精度付加価値曲線の想像が必要 ① Max Value

一番考えやすいポイントは、「精度がmaxだったときにどれくらい嬉しいか」(=max valueの大きさ)である。

② MVA(Minimum Viable Accuracy)

次に考えるべきなのは、ミニマムでどのくらいの精度が出ると嬉しいのか、である。 特定精度を達成した時の結果のモックデータ、精度モックを作って気持ちを持つこともできる。 たとえば、xx%ぐらいの精度が達成された時の結果の画面を人為的に手で作ってみる

③ 人間の達成精度

人間の達成精度 < MVA」の時は要注意である。 人間にできないことを機械がやすやすとできる問題設定ももちろん中にはあるものの、あなたたちがいま機械学習で解こうとしている問題はそうではない可能性が高いのではないだろうか。

④ ベースラインモデルの精度

ここまできてからやっとコードを書き始めれば良い。今手元にあるデータセット、雑な手法で学習と評価のパイプラインを一周させるベースラインモデルの精度を測定してみる。これがMVAより高ければ万々歳だし、超えていなくても値が近ければ良いシグナルだ。

理想的なケース

MVA < ベースラインモデルの精度 <<<< 人間の精度 < 100%(max value) こんなケースはすごく筋が良さそうに見える

コメント

良 (語彙力)

出典

元記事

GENZITSU commented 3 years ago

日本語ByT5事前学習済みモデル

hugging faceにて登場

次の日本語コーパスを用いて事前学習を行ったByT5 (a tokenizer-free extension of the Text-to-Text Transfer Transformer) モデルです。

  • Wikipediaの日本語ダンプデータ (2020年7月6日時点のもの)
  • OSCARの日本語コーパス
  • CC-100の日本語コーパス

コメント

ありがたい

出典

元記事

GENZITSU commented 3 years ago

日本語T5事前学習済みモデル

hugging faceにて登場

次の日本語コーパスを用いて事前学習を行ったT5 (Text-to-Text Transfer Transformer) モデルです。

  • Wikipediaの日本語ダンプデータ (2020年7月6日時点のもの)
  • mC4の日本語コーパス(正確にはc4/multilingualのjaスプリット)

コメント

ありがたい

出典

元記事

GENZITSU commented 3 years ago

Increasing number of attempts ver. 2021

研究の試行回数を増やすための効率化テクがたくさんまとめられている。

その中からためになったものを抜粋。

スクリーンショット 2021-08-04 21 16 56 スクリーンショット 2021-08-04 21 17 13 スクリーンショット 2021-08-04 21 17 41 スクリーンショット 2021-08-04 21 18 16 スクリーンショット 2021-08-04 21 18 27 スクリーンショット 2021-08-04 21 21 12 スクリーンショット 2021-08-04 21 21 29 スクリーンショット 2021-08-04 21 22 44

コメント

zsh系の話あまり知らなかった。
まだbashなので、これを機に以降したい。

出典

元記事

GENZITSU commented 3 years ago

朝飯前に学べる!便利なPythonのヒント100選【後編】

ためになったものを抜粋

58. パラメータを何個でも指定して呼び出せるメソッドを定義する

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

def get_sum(*arguments):
    result = 0
    for i in arguments:
        result += i
    return result

print(get_sum(1, 2, 3)) # 6
print(get_sum(1, 2, 3, 4, 5)) # 15
print(get_sum(1, 2, 3, 4, 5, 6, 7)) # 28

65. 文字列のすべての文字がアルファベットまたは数字か調べる

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

name = "Password"
print(name.isalnum()) # True, because all characters are alphabets
name = "Secure Password "
print(name.isalnum()) # False, because it contains whitespaces
name = "S3cur3P4ssw0rd"
print(name.isalnum()) # True
name = "133"
print(name.isalnum()) # True, because all characters are numbers

66. 文字列のすべての文字がアルファベットか調べる

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

string = "Name"
print(string.isalpha()) # True
string = "Firstname Lastname"
print(string.isalpha()) # False, because it contains whitespace
string = "P4ssw0rd"
print(string.isalpha()) # False, because it contains numbers

68. 文字列が数値か調べる

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

string = "seven"
print(string.isdigit()) # False
string = "1337"
print(string.isdigit()) # True
string = "5a"
print(string.isdigit()) # False, because it contains the character 'a'
string = "2**5"
print(string.isdigit()) # False

69. 文字列が漢数字か調べる

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

# 42673 in Arabic numerals
string = "四二六七三"
print(string.isdigit()) # False
print(string.isnumeric()) # True

82. 1つのif文で複数条件を指定する

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

math_points = 51
biology_points = 78
physics_points = 56
history_points = 72

my_conditions = [math_points > 50, biology_points > 50, physics_points > 50, history_points > 50]

if all(my_conditions):
    print("Congratulations! You have passed all of the exams.")
else:
    print("I am sorry, but it seems that you have to repeat at least one exam.")
# Congratulations! You have passed all of the exams.

83. 1つのif文で、複数条件のうち少なくとも1つの条件を満たす

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

math_points = 51
biology_points = 78
physics_points = 56
history_points = 72

my_conditions = [math_points > 50, biology_points > 50, physics_points > 50, history_points > 50]

if any(my_conditions):
    print("Congratulations! You have passed all of the exams.")
else:
    print("I am sorry, but it seems that you have to repeat at least one exam.")
# Congratulations! You have passed all of the exams.

97. モジュールの場所を出力する

# from https://qiita.com/baby-degu/items/532bea7be058c35f61a8#58-%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%82%92%E4%BD%95%E5%80%8B%E3%81%A7%E3%82%82%E6%8C%87%E5%AE%9A%E3%81%97%E3%81%A6%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%9B%E3%82%8B%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%82%92%E5%AE%9A%E7%BE%A9%E3%81%99%E3%82%8B

import torch
print(torch) # <module 'torch' from '/Users/...'

コメント

以下が一押し

出典

元記事

GENZITSU commented 3 years ago

アフリカの衛星画像セグメンテーションに関するテクニカルレポート

google researchによるレポート。
どのように精度向上をして行ったかが面白い。

1. Tversky Lossの利用

hard exampleを重視させるγは1以下の方がよかったようで、hard exampleは実はラベリングミスではと考察

スクリーンショット 2021-08-05 22 42 55

2. gaussian weighting

インスタンスの境界の重みを強くするために、エッジを1として、gaussianをかける。
これはpixel weightingの本系よりも計算効率が高い

スクリーンショット 2021-08-05 22 43 43 スクリーンショット 2021-08-05 22 44 27 スクリーンショット 2021-08-05 22 44 35

3. mixup

semantic segmentation用のmixupを実施。 といっても、xの方は普通のmixup。 変わっているのはラベル側で、ラベルのmixupをとるのではなく、L_CEのmixupを行う。

スクリーンショット 2021-08-05 22 44 48

4. post processing

ensemble, TTAに加えて、instanceに対するdilation処理を行なっている。

スクリーンショット 2021-08-05 22 46 14

5. 最終系

distance weighting / nux upなどが特に聞いており、最後の一押しにself-trainingが使われている。
self-trainingではラベルなし衛星画像をもちいてnoisy studentを行ったようだ。

スクリーンショット 2021-08-05 22 56 08 スクリーンショット 2021-08-05 22 47 32

コメント

segmentation用のmixupが印象的だった。

出典

元記事

GENZITSU commented 3 years ago

PyTorchの再現性に関して

結論これを書けば余分なことがあっても、不足はほとんどないはずです。

  • seedの指定
  • cudaの設定
  • dataloaderの設定
# from https://qiita.com/north_redwing/items/1e153139125d37829d2d

import random
import numpy as np
import torch

random.seed(0)
np.random.seed(0)
torch.manual_seed(0)
torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True

def seed_worker(worker_id):
    worker_seed = torch.initial_seed() % 2**32
    numpy.random.seed(worker_seed)
    random.seed(worker_seed)

g = torch.Generator()
g.manual_seed(0)

DataLoader(
    train_dataset,
    batch_size=batch_size,
    num_workers=num_workers,
    worker_init_fn=seed_worker
    generator=g,
)

それぞれの設定の意味についても説明されている。

CUDA convolution benchmarking

再現性を無視してでも速度の点でベンチマークを測る際に必要なオプション torch.backends.cudnn.benchmark を False にしましょう。

CUDA convolution determinism

こちらについては特に理由が書かれてない模様。

torch.use_deterministic_algorithms(True) と torch.backends.cudnn.deterministic = True は何が異なるのかといえば、前者の方がより幅広く決定的な操作にする設定のようです。幅広く、とはどの程度のことを指すのか具体的なことは書いてありませんでしたし、パッと調べる限りその点に触れた記事はありませんでした。 調べる限りでは、後者の方が使われている気がします。

DataLoader

場合によってはこれをしないと望む再現性が得られません。 これが問題となるのは複数スレッドでdataloaderを使う場合です。あるいは、経験上、複数のdataloaderを使用する場合も該当すると思います。

その複数スレッドのseedを全て同じにしてしまう操作を seed_worker で定義している感じでしょうか。 g が必要な経緯や何をやっているかは分かりませんでした。

コメント

こういうスニペット助かる。

出典

元記事

pytorch公式

GENZITSU commented 3 years ago

Hidden Biases in Unreliable News Detection Datasets

wantedlyの紹介記事が秀逸なので、一部だけ抜粋。

どんなバイアスがあるのか

  • keyword correlations ラベルが特定の単語に置いて分布が強く偏ること。 有名人に関する単語(ex. "Trump","Brad","Pitt")を含んでいる多くの記事は信頼できない記事とアノテーションされていた。これは、有名人に関する記事はゴシップが多く、信頼性の低い記事が多いから。 一方で、記事の特徴を表さないようなワード(2018,summer)などを含む記事は、信頼できるとアノテーションされる傾向にある。 このような傾向によって、記事の信頼度ではなく、単に単語の出現の有無によって判定されてしまう。 このデータセットを学習した場合、BERTで81%、BoWで構築したlogisticで78%の精度となった。

  • Dataset Selection Bias train test splitの分け方が悪く、モデルが意図しないデータの学習を行ってしまうこと。 NELAデータセットでは、train, testに同じサイトが含まれており、記事の良し悪しでなくサイトの判別を行うモデルが作成されてしまった。

バイアスの対処法

スクリーンショット 2021-08-08 12 54 46

コメント

単語/サイトに引っ張られやすいのは面白かった。
サイト情報はどうしても記事に入ってしまうのでstopwords的にフィルタした方がいいのかもしれない。

出典

元論文
要約記事
wantedlyの記事

GENZITSU commented 3 years ago

TwitterのAIバイアス発見コンテスト、「若くてスリムな顔優先」発見に3500ドル

以前みつけたTwitter社のコンテストの結果が発表されていた。

1位は、アルゴリズムが「スリムで若く見え、肌の色が薄い顔を優先する」と指摘したスイスのEPFL工科大学の大学院生、ボグダン・クリニッチ氏。同氏には賞金3500ドル(約39万円)が贈られる。

優勝したクリニッチ氏によると、TwitterのAIは、「スリムで若く、明るいか暖かい肌の色、なめらかな肌の質感、女性的な顔の人々を優先する方向に偏っている」と指摘した。「このバイアスは、少数派の集団の排除と、ステレオタイプの美しさの基準の永続化をもたらす可能性がある」という。

gan的なもので画像生成&操作を行って検証したとのこと。こういう使い方があるのは面白い。

スクリーンショット 2021-08-10 20 38 12

コメント

画像生成にこういう使い方があるのは面白い。
今後のスタンダードになりうるのでは?

出典

元記事

GENZITSU commented 3 years ago

説得力のあるフィッシング詐欺のメールを、AIが人間よりうまく“書く”時代がやってきた

今回の最新の実験結果はシンガポール国立テクノロジー庁のチームが手がけたもので、8月上旬にラスヴェガスで開催されたセキュリティカンファレンス「Black Hat」と「DEF CON」で発表された。

研究チームは、メンバー自身が作成した標的型フィッシングメールとAIaaSプラットフォームが作成したフィッシングメールを、同僚200人に送信した。

この結果に研究チームは驚いた。人が書いたメッセージのリンクよりも、AIが作成したメッセージのリンクのほうが、はるかに多くクリックされていたのである。

今回の実験に際して研究チームは、OpenAIのGPT-3プラットフォームと、個人の性格の分析に特化した別のAIaaSを利用して、同僚たちの背景情報や特徴に合わせたフィッシングメールを作成した。個人の性格の分析に特化した機械学習モデルは、個人の行動に関するインプットに基づいて個人の傾向や気質を予測するものだ。

研究チームは、モデルのアウトプットを複数のサーヴィスにかけることで、メールを送信する前に流れ作業のように文面を校正するラインを組んだ。その結果、完成した文章は「不気味なほど人間らしく」なったという。しかも自動化されたプラットフォームであるにもかかわらず、驚くほど細部にまで凝った文章が出力されたという。例えば、シンガポール在住者に向けて生み出されたコンテンツでは、シンガポールの国内法について言及されていた。

OpenAIは以前から、こうしたAIが悪用される可能性について懸念を抱いていた。なお、研究チームによると、OpenAIやその他のAIaaSプロヴァイダーには明確な行動規範があり、プラットフォームの監査を通じて悪意に基づく利用に目を光らせ、一定水準のユーザー認証を実施しているという。

コメント

悪意を持っていた人がAIをフル活用するとかなり低コストで悪いことができてしまうっぽい。
それこそ、5秒のサンプリングで自然な音声合成を行う技術など使うと、簡単に詐欺を働けるわけで,,,,

出典

元記事

GENZITSU commented 3 years ago

PyTorchの学習済みモデルを自由自在に書き換えたい

これを転移学習に使うことも多いです。その際、学習済モデルを少し改造して試したい場合、どうすればいいのか。直接編集するわけではありませんが、同等の効果がある方法をご紹介します。

  1. 挿入するにはtorch.nn.Sequentialで置き換える
  2. 削除するにはtorch.nn.Indentityで置き換える

出力の特徴数を変更する


# from https://qiita.com/saliton/items/76707baee8467ac3511b

model.fc.out_features = 100


> レイヤーを置き換える

from https://qiita.com/saliton/items/76707baee8467ac3511b

model.act1 = torch.nn.LeakyReLU(inplace=True)


> レイヤーを挿入する

from https://qiita.com/saliton/items/76707baee8467ac3511b

from torch.nn import Sequential, Dropout model.fc = Sequential(Dropout(0.5), model.fc)


> レイヤーを削除する

from https://qiita.com/saliton/items/76707baee8467ac3511b

model.fc = torch.nn.Identity()



### コメント
学習済みモデルをカスタマイズしたいという時は割とあるので、役立ちそう。

### 出典
[元記事](https://qiita.com/saliton/items/76707baee8467ac3511b)
GENZITSU commented 3 years ago

Pythonの異常検知ライブラリPyOD

テーブルデータに対する異常検知における古典的なモデルから最新のモデルまでが充実している。

使用方法はsklearnライク

# from https://pyod.readthedocs.io/en/latest/

from pyod.models.copod import COPOD
clf = COPOD()
clf.fit(X_train)

# get outlier scores
y_train_scores = clf.decision_scores_  # raw outlier scores on the train data
y_test_scores = clf.decision_function(X_test)  # predict raw outlier scores on test

実装されている手法は引くほどある。

スクリーンショット 2021-08-10 21 12 05 スクリーンショット 2021-08-10 21 11 41

コメント

かなり便利そう。

どうやら、XGBODというのが強いらしい。元ツイ

また、最近pyodライクに使えるKDE異常検知の実装記事が上がっていた。

出典

元記事

GENZITSU commented 3 years ago

7 Cool Python Packages Kagglers Are Using Without Telling You

自分の知らなかったものだけ抜粋。

Datatable

It is developed by H2O.ai to support parallel-computing and out-of-memory operations on big data (up to 100 GB)

While datatable does not have as large a suite of manipulation functions as pandas, it is found to heavily outperform it on most common operations. In an experiment done on a 100M row dataset, datatable manages to read the data into memory in just over a minute, 9 times faster than pandas.

簡単な使い方 若干使い勝手が悪そうだ...

# from https://towardsdatascience.com/7-cool-python-packages-kagglers-are-using-without-telling-you-e83298781cf4

import datatable as dt  # pip install datatable

frame = dt.fread("data/station_day.csv")
frame.head(5)

from datatable import by, f, sum

tips = sns.load_dataset("tips")
frame = dt.Frame(tips)
frame[:, sum(f.total_bill), by(f.size)]

Lazypredict

sklearn収録のほとんどのモデルとxgboost, lightgbmを合わせたモデルをワンライナーで学習し性能確認が行えるライブラリ。

# from https://towardsdatascience.com/7-cool-python-packages-kagglers-are-using-without-telling-you-e83298781cf4

from lazypredict.Supervised import (  # pip install lazypredict
    LazyClassifier,
    LazyRegressor,
)
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split

# Load data and split
X, y = load_boston(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# Fit LazyRegressor
reg = LazyRegressor(
    ignore_warnings=True, random_state=1121218, verbose=False
  )
models, predictions = reg.fit(X_train, X_test, y_train, y_test)  # pass all sets

>>> models.head(10)
スクリーンショット 2021-08-10 21 37 15

Automatic EDA libraries

全部見た感じ、starが一番多いluxが一番使いやすそうだった。

スクリーンショット 2021-08-10 21 37 15 スクリーンショット 2021-08-10 21 37 15

コメント

紹介したものの使うかと言われると微妙かもしれない。
Luxについては、これでざっと見て深く分析したいときに手でコード書くみたいな感じはあり得そう。

出典

元記事

GENZITSU commented 3 years ago

Stanford AIMI Shared Datasets

A collection of de-identified annotated medical imaging data to foster transparent and reproducible collaborative research.

どのデータも数GB以上あるので実用的に見える。

現在のお品書き

10 dataset(s) found

  • BrainMetShare
  • EchoNet-Dynamic
  • COCA- Coronary Calcium and chest CT’s
  • CT Pulmonary Angiography
  • CheXpert: Chest X-rays
  • LERA- Lower Extremity Radiographs
  • CheXphoto
  • CheXplanation
  • MRNet: Knee MRI's
  • MURA: MSK Xrays

サンプル

スクリーンショット 2021-08-10 22 11 43

コメント

医療系PJTの際に参照したい

出典

元記事

GENZITSU commented 3 years ago

Pythonパッケージを公開するときに便利なツール/サービス

Poetry

パッケージとして公開するための機能も優れています。

具体的には、以下の3ステップでPyPIにリリースすることができます。


# from https://zenn.dev/yag_ays/articles/1743f4bad38e82

$ poetry config pypi-token.pypi $pypi-token # 最初だけ $ poetry build $ poetry publish


> 従来setup.pyに記載していたパッケージ公開用の各種メタ情報はpyproject.tomlに記載します。

> また、PyPIのテスト環境へのリリースもサポートしています。

from https://zenn.dev/yag_ays/articles/1743f4bad38e82

$ poetry publish -r testpypi



### Mkdocs
> 主な特徴は以下の通りです。
> - Markdownで書くことができる
> - YAMLファイル1つで設定が完結
> - テーマが豊富 (MkDocs Themes · mkdocs/mkdocs Wiki)
> - CLIでローカル上にサーバを起動させたり、GitHub Pagesへのリリースができる

### github actions
これを用いた自動リリースについて述べられていた

### Carbon
> コードを綺麗にハイライトして画像として保存できるサービスです。

<img width="500" alt="スクリーンショット 2021-08-10 23 16 03" src="https://user-images.githubusercontent.com/19774756/128883130-91f2f74a-adeb-4de8-ad9c-399e4cf5ed73.png">

### コメント
どれも実用的なものばかり。

### 出典
[元記事](https://zenn.dev/yag_ays/articles/1743f4bad38e82)
GENZITSU commented 3 years ago

回帰問題でのDropoutの悪影響とその対策

Pitfalls with Dropout and BatchNorm in regression problemsという記事の検証記事

注意

今回の検証結果では回帰問題でDropoutを使うことで悪影響があるという結論に至ったが、実際のタスクでは汎化性能向上による良い影響もあるという点に注意してほしい。

まとめ

  • Dropoutによる悪影響
    • 回帰問題でDropoutを使うと、正解値の絶対値が大きいときに推定値が小さくなる傾向があった。Dropoutの後に非線形層(ReLUなど)があるとその効果は特に顕著であった。
  • 対策
    • Dropoutの代わりにGaussianDropout, UniformDropoutを使うと悪影響がある程度改善された。
    • MontecarloDropoutを使うと悪影響がなくなった。
  • 考察
    • 対策手法ではDropout適用後の分散の変化が小さくなる(と思う)ので、対策により結果が改善されたと考えられる。
  • その他
    • 分類問題ではDropoutを使っても悪影響はなかった。

Gist形式で詳細な検証がまとめられいてる。

要点としては

  • ランダムにxの値が0になるため、Dropoutを通す場合(学習時)と通さない場合(推論時)ではhの統計量が変わる。学習と推論でhの平均値が変わらないような工夫がされているが、分散は変わってしまう。
  • hの統計量が変わるため、Dropout以降の層で学習時と推論時で不整合が起きる。これが性能に悪影響を与えることがある。
    • BNとDropoutを同時に使うと性能が落ちることがあるのもこれが原因らしい。

いくつか結果を抜粋

スクリーンショット 2021-08-10 23 36 50 スクリーンショット 2021-08-10 23 37 10

ちなみに、Montecarlo DropoutはDropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learningで提案されたもので、推論時もmodelをtrainモードで実行し、複数回の推論の平均を予測とすることを言う。

スクリーンショット 2021-08-10 23 37 10

modelをtrainモードで動かすのはcommon litの5位解法でも使われている。

コメント

dropout通しても平均値変わらないしええやんと思っていたが、確かに分散は変わってしまう。
これがBNとDropoutを併用したときに精度が落ちうる原因だったのか、知らなかった。

汎化性能については未検証とのことだが、回帰でdropout使う時は注意していきたい。

というとかこの検証すごいな...

出典

元記事

GENZITSU commented 3 years ago

【AI論文解説】万能な事前学習済みモデルをうまく学習するための理論解析 -詳細編-(ICML2021論文紹介)

"Understanding Self-supervised Learning Dynamics without Contrastive Pairs," ICML 2021.の解説動画 (ちなみにこの論文の第二著者はsimsiamの第一著者らしい。)

自己教師あり学習がなぜうまくいくかを理論的に解説した論文で、以下のような帰結を得ている。

スクリーンショット 2021-08-10 23 58 09 スクリーンショット 2021-08-10 23 55 07 スクリーンショット 2021-08-10 23 55 51 スクリーンショット 2021-08-10 23 56 40 スクリーンショット 2021-08-10 23 56 51

コメント

すげー論文が出てきたものだ。
解説がめちゃくちゃわかりやすい。

出典

元動画