Open GENZITSU opened 3 years ago
精度付加価値曲線の想像が必要 ① Max Value
一番考えやすいポイントは、「精度がmaxだったときにどれくらい嬉しいか」(=max valueの大きさ)である。
② MVA(Minimum Viable Accuracy)
次に考えるべきなのは、ミニマムでどのくらいの精度が出ると嬉しいのか、である。 特定精度を達成した時の結果のモックデータ、精度モックを作って気持ちを持つこともできる。 たとえば、xx%ぐらいの精度が達成された時の結果の画面を人為的に手で作ってみる
③ 人間の達成精度
人間の達成精度 < MVA」の時は要注意である。 人間にできないことを機械がやすやすとできる問題設定ももちろん中にはあるものの、あなたたちがいま機械学習で解こうとしている問題はそうではない可能性が高いのではないだろうか。
④ ベースラインモデルの精度
ここまできてからやっとコードを書き始めれば良い。今手元にあるデータセット、雑な手法で学習と評価のパイプラインを一周させるベースラインモデルの精度を測定してみる。これがMVAより高ければ万々歳だし、超えていなくても値が近ければ良いシグナルだ。
理想的なケース
MVA < ベースラインモデルの精度 <<<< 人間の精度 < 100%(max value) こんなケースはすごく筋が良さそうに見える
良 (語彙力)
hugging faceにて登場
次の日本語コーパスを用いて事前学習を行ったByT5 (a tokenizer-free extension of the Text-to-Text Transfer Transformer) モデルです。
- Wikipediaの日本語ダンプデータ (2020年7月6日時点のもの)
- OSCARの日本語コーパス
- CC-100の日本語コーパス
ありがたい
hugging faceにて登場
次の日本語コーパスを用いて事前学習を行ったT5 (Text-to-Text Transfer Transformer) モデルです。
- Wikipediaの日本語ダンプデータ (2020年7月6日時点のもの)
- mC4の日本語コーパス(正確にはc4/multilingualのjaスプリット)
ありがたい
研究の試行回数を増やすための効率化テクがたくさんまとめられている。
その中からためになったものを抜粋。
zsh系の話あまり知らなかった。
まだbashなので、これを機に以降したい。
ためになったものを抜粋
# 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
# 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
# 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
# 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
# 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
# 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.
# 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.
# 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/...'
以下が一押し
google researchによるレポート。
どのように精度向上をして行ったかが面白い。
hard exampleを重視させるγは1以下の方がよかったようで、hard exampleは実はラベリングミスではと考察
インスタンスの境界の重みを強くするために、エッジを1として、gaussianをかける。
これはpixel weightingの本系よりも計算効率が高い
semantic segmentation用のmixupを実施。 といっても、xの方は普通のmixup。 変わっているのはラベル側で、ラベルのmixupをとるのではなく、L_CEのmixupを行う。
ensemble, TTAに加えて、instanceに対するdilation処理を行なっている。
distance weighting / nux upなどが特に聞いており、最後の一押しにself-trainingが使われている。
self-trainingではラベルなし衛星画像をもちいてnoisy studentを行ったようだ。
segmentation用のmixupが印象的だった。
結論これを書けば余分なことがあっても、不足はほとんどないはずです。
- 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,
)
それぞれの設定の意味についても説明されている。
再現性を無視してでも速度の点でベンチマークを測る際に必要なオプション
torch.backends.cudnn.benchmark
を False にしましょう。
こちらについては特に理由が書かれてない模様。
torch.use_deterministic_algorithms(True) と torch.backends.cudnn.deterministic = True は何が異なるのかといえば、前者の方がより幅広く決定的な操作にする設定のようです。幅広く、とはどの程度のことを指すのか具体的なことは書いてありませんでしたし、パッと調べる限りその点に触れた記事はありませんでした。 調べる限りでは、後者の方が使われている気がします。
場合によってはこれをしないと望む再現性が得られません。 これが問題となるのは複数スレッドでdataloaderを使う場合です。あるいは、経験上、複数のdataloaderを使用する場合も該当すると思います。
その複数スレッドのseedを全て同じにしてしまう操作を seed_worker で定義している感じでしょうか。 g が必要な経緯や何をやっているかは分かりませんでした。
こういうスニペット助かる。
wantedlyの紹介記事が秀逸なので、一部だけ抜粋。
keyword correlations ラベルが特定の単語に置いて分布が強く偏ること。 有名人に関する単語(ex. "Trump","Brad","Pitt")を含んでいる多くの記事は信頼できない記事とアノテーションされていた。これは、有名人に関する記事はゴシップが多く、信頼性の低い記事が多いから。 一方で、記事の特徴を表さないようなワード(2018,summer)などを含む記事は、信頼できるとアノテーションされる傾向にある。 このような傾向によって、記事の信頼度ではなく、単に単語の出現の有無によって判定されてしまう。 このデータセットを学習した場合、BERTで81%、BoWで構築したlogisticで78%の精度となった。
Dataset Selection Bias train test splitの分け方が悪く、モデルが意図しないデータの学習を行ってしまうこと。 NELAデータセットでは、train, testに同じサイトが含まれており、記事の良し悪しでなくサイトの判別を行うモデルが作成されてしまった。
単語/サイトに引っ張られやすいのは面白かった。
サイト情報はどうしても記事に入ってしまうのでstopwords的にフィルタした方がいいのかもしれない。
以前みつけたTwitter社のコンテストの結果が発表されていた。
1位は、アルゴリズムが「スリムで若く見え、肌の色が薄い顔を優先する」と指摘したスイスのEPFL工科大学の大学院生、ボグダン・クリニッチ氏。同氏には賞金3500ドル(約39万円)が贈られる。
優勝したクリニッチ氏によると、TwitterのAIは、「スリムで若く、明るいか暖かい肌の色、なめらかな肌の質感、女性的な顔の人々を優先する方向に偏っている」と指摘した。「このバイアスは、少数派の集団の排除と、ステレオタイプの美しさの基準の永続化をもたらす可能性がある」という。
gan的なもので画像生成&操作を行って検証したとのこと。こういう使い方があるのは面白い。
画像生成にこういう使い方があるのは面白い。
今後のスタンダードになりうるのでは?
今回の最新の実験結果はシンガポール国立テクノロジー庁のチームが手がけたもので、8月上旬にラスヴェガスで開催されたセキュリティカンファレンス「Black Hat」と「DEF CON」で発表された。
研究チームは、メンバー自身が作成した標的型フィッシングメールとAIaaSプラットフォームが作成したフィッシングメールを、同僚200人に送信した。
この結果に研究チームは驚いた。人が書いたメッセージのリンクよりも、AIが作成したメッセージのリンクのほうが、はるかに多くクリックされていたのである。
今回の実験に際して研究チームは、OpenAIのGPT-3プラットフォームと、個人の性格の分析に特化した別のAIaaSを利用して、同僚たちの背景情報や特徴に合わせたフィッシングメールを作成した。個人の性格の分析に特化した機械学習モデルは、個人の行動に関するインプットに基づいて個人の傾向や気質を予測するものだ。
研究チームは、モデルのアウトプットを複数のサーヴィスにかけることで、メールを送信する前に流れ作業のように文面を校正するラインを組んだ。その結果、完成した文章は「不気味なほど人間らしく」なったという。しかも自動化されたプラットフォームであるにもかかわらず、驚くほど細部にまで凝った文章が出力されたという。例えば、シンガポール在住者に向けて生み出されたコンテンツでは、シンガポールの国内法について言及されていた。
OpenAIは以前から、こうしたAIが悪用される可能性について懸念を抱いていた。なお、研究チームによると、OpenAIやその他のAIaaSプロヴァイダーには明確な行動規範があり、プラットフォームの監査を通じて悪意に基づく利用に目を光らせ、一定水準のユーザー認証を実施しているという。
悪意を持っていた人がAIをフル活用するとかなり低コストで悪いことができてしまうっぽい。
それこそ、5秒のサンプリングで自然な音声合成を行う技術など使うと、簡単に詐欺を働けるわけで,,,,
これを転移学習に使うことも多いです。その際、学習済モデルを少し改造して試したい場合、どうすればいいのか。直接編集するわけではありませんが、同等の効果がある方法をご紹介します。
- 挿入するにはtorch.nn.Sequentialで置き換える
- 削除するにはtorch.nn.Indentityで置き換える
出力の特徴数を変更する
# from https://qiita.com/saliton/items/76707baee8467ac3511b
model.fc.out_features = 100
> レイヤーを置き換える
model.act1 = torch.nn.LeakyReLU(inplace=True)
> レイヤーを挿入する
from torch.nn import Sequential, Dropout model.fc = Sequential(Dropout(0.5), model.fc)
> レイヤーを削除する
model.fc = torch.nn.Identity()
### コメント
学習済みモデルをカスタマイズしたいという時は割とあるので、役立ちそう。
### 出典
[元記事](https://qiita.com/saliton/items/76707baee8467ac3511b)
テーブルデータに対する異常検知における古典的なモデルから最新のモデルまでが充実している。
使用方法は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
実装されている手法は引くほどある。
かなり便利そう。
どうやら、XGBODというのが強いらしい。元ツイ
また、最近pyodライクに使えるKDE異常検知の実装記事が上がっていた。
自分の知らなかったものだけ抜粋。
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)]
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)
全部見た感じ、starが一番多いluxが一番使いやすそうだった。
紹介したものの使うかと言われると微妙かもしれない。
Luxについては、これでざっと見て深く分析したいときに手でコード書くみたいな感じはあり得そう。
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
サンプル
医療系PJTの際に参照したい
パッケージとして公開するための機能も優れています。
具体的には、以下の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のテスト環境へのリリースもサポートしています。
$ 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)
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を同時に使うと性能が落ちることがあるのもこれが原因らしい。
いくつか結果を抜粋
ちなみに、Montecarlo DropoutはDropout as a Bayesian Approximation: Representing Model Uncertainty in Deep Learningで提案されたもので、推論時もmodelをtrainモードで実行し、複数回の推論の平均を予測とすることを言う。
modelをtrainモードで動かすのはcommon litの5位解法でも使われている。
dropout通しても平均値変わらないしええやんと思っていたが、確かに分散は変わってしまう。
これがBNとDropoutを併用したときに精度が落ちうる原因だったのか、知らなかった。
汎化性能については未検証とのことだが、回帰でdropout使う時は注意していきたい。
というとかこの検証すごいな...
"Understanding Self-supervised Learning Dynamics without Contrastive Pairs," ICML 2021.の解説動画 (ちなみにこの論文の第二著者はsimsiamの第一著者らしい。)
自己教師あり学習がなぜうまくいくかを理論的に解説した論文で、以下のような帰結を得ている。
すげー論文が出てきたものだ。
解説がめちゃくちゃわかりやすい。
BERTで英検を解く
2021年第1回の英検の問題を各級から10問取得して、BERTでといてみた記事。
BERTによる
結果はこんなこんな感じで、peplexityが一番良い
コメント
perplexityの比較というアイデアは面白い。
コードも充実しているので、覗いてみたい。
出典
元記事
kernel
git