Open GENZITSU opened 1 year ago
ここ数年のうちに世間を騒がせた大規模モデルたちのテックブログなどを時系列順にまとめているサイト。 これまでどんなモデルがいて、今どんな流れになっているかをざっくり知ることができる。
こういうまとめ意外と助かる。
フェイクニュース検出データセットに存在する作成時期のバイアスを緩和するための手法の提案 @ ANLP2021
フェイクニュース検出データセットはその特性上、特定の人物や事象に対するニュースが多くなってしまうため、それらの単語が入っているだけでフェイクと判定されてしまう危険性を孕んでいる。
いかのように、人名はフェイクニュースに対してかなり高い相関があることが確認されている。
ちなみにLMIとはこれ
これを緩和する手法として以下を検討
以下が実験結果で、残念ながら同ドメインでの検証だと何もしないLexicalizedが最も性能が高い
しかし別ドメインへでのテストデータで比較を行ってみると、WikiDやNEDeletionなどの手法が有効であることが確認された。
Celebrityでは効果が振るわなかった理由は下記
一方で,芸能系のドメインである Celebrity をテストデータとしたとき,Lexicalized と変わらない検 出精度であった.これは,学習データが政治系を中心としたものでドメインが大きく異なることから,Wikidata を活用できず大きな効果が見られなかった
フェイクニュース以外の話でも、通時性をもつ自然言語処理に対しては同様のバイアス除去が役に立ちそうな気がする。
全ての画像をLennaさんに変換することで、綺麗に変換できないもは異常であると判断する狂気じみた異常検知手法が発表された。
代表的な手法
提案手法
全ての画像をLennaさんにするように学習させるため出力の多様性が少ない & 生成誤差の算出が楽。
結果
意外と精度がでるらしい。
多分、画像として全く違わないとうまくいかない気がするが、アイデアとしては面白い。
本題とは関係ないが、Lennaさんの画像を使うのはもうあんまり良くないはずなんだが、論文の題材にしてよいのでしょうかね...
ConvNeXtを32x32の極小画像に対しても高精度が出るようにどのように改造して行ったかが綴られている記事。
224x224(imagenet size)用と思われるstride, kernel_size, downsamling, 前処理の統計量などを32x32(CIFAR10)用に改造していくことで、高精度を達成。
VisionTransformer並みの精度をcnnでも達成できるよとして、一世を風靡しているモデル。
ただし、こいつだと32x32の画像に対する分類があまりうまくいかなかったとのこと
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")
)
これも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
# 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),
)
imagenetの統計量からCIFAR10の統計量に変更
データセントリックな時代にアーキテクチャーの改良を実施し、実際に結果を出しているのがすごい。
データ、データ言われる時代ですが、ある程度データが集まった先はやはりアーキテクチャーの探索をしていかないといけないんだなぁと感じた。
角度によらず顔の角度推定を行うことができるモデルのコードとweightsが公開、AFLW2000とBIWIというデータセットでSOTAを20%ほど改善したとのこと。
手法の肝としては、
角度推定を行う際にはEuler角やquaternionなどを教師データとして利用することが可能だがそれぞれ課題がある。
そこで曖昧性が生じない3x3の回転行列を推測させに行くことが考えられるが、回転行列にはR RT = Iとなるような制約があり、これを取り込む必要が出てくる。
そこでグラムシュミットの直行化にinspireされた方法で3x3ではなく3x2の行列を求めてにいくこととした
3x2 → 3x3への変換は下記のように実施できる
また、3x3の行列同士を比較する際にMSEを使ってしまうと、3次元多様体の制約を無視してしまいがちなので、以下のようなロスを提案
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
結果
あえてパラメータを増やすことで、full rangeの角度推定を曖昧性なしに行うことができるというのは面白い発想。
ちなみにオイラー角⇆回転行列の変換はこのブログが詳しい
v0.2.0になったことで、精度が99.2→99.9へ向上
# 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': ' '}
すごい
表題の通り。
df.dropがindexも受け付けるので以下のようにすれば良い
# from https://ensekitt.hatenablog.com/entry/2018/05/30/200000
df_not_sample = df.drop(df_sample.index)
df_not_sample
最近似たようなことをやりたい時があったので助かった。
回帰モデルの係数を推定する際に、より正確な推定値を得るために様々な選択方法を検討している記事。
変数選択しない場合
Lassoを用いて変数選択する場合
Double selectionを用いる手法
Rigorous Lasso
Double Machine Leaning & Honest Learning
一覧表
今回は100件程度しかデータを生成していないことに注意
聞いたことがない手法ばかりで大変勉強になった。
表題の通り、特にためになったものだけ抜粋
- MLでは再現性のある学習が必要。再現性で求められることは、自分以外の人間が同じデータと同じ学習コード、同じアルゴリズムとパラメータ、同じライブラリとバージョンで学習を実行し、自分と大差ない結果を得ることができること。
- 推論結果から、アクションをおこす必要のある関係者やステークホルダーを含めて受け入れ試験をするのがよい。
- 推論結果が社内プロセスに組み込まれ、人間の介入が必要になる「ヒューマンインザループ」のワークフローを作ることがある。この場合は、人間の作業が可能な範囲で実施する設計にするべき。例えば、すべてを専門家が確認するプロセスは破綻する。
- ヒューマンインザループのプロセスの場合、人間がタスクを実行可能でない量の推論では、ビジネスにネガティブな影響を与える可能性さえある。
- 推論器の評価には、システムとしての「リリース判定」が必要。
- モデル開発と本番システム(推論)で共通のOS、言語、依存ライブラリのバージョンをそろえて開発する。
- 学習に利用したデータも管理する。評価時に、学習済みのデータを使ってしまい、正当に評価されていないモデルがリリースされるリスクがある。
- OS、ライブラリ、バージョン、稼働モデル、入力データ形式、モデルの目的は一元管理する
心に留めておきたい
表題の通り。
気になったところだけ抜粋
バックアップとレプリケーションは全く異なる
様々な理由で制約を使わない誘惑かられてしまうが、ひどい未来が待っている
業務でDBいじることほぼないけど気をつけたい。
小ネタ:Pytorch で Automatic Mixed Precision (AMP) の ON/OFF をするときの話
PytorchでのAutomatic Mixed PrecisionのON/OFFをコード上で綺麗に制御するためのtips
if / elseを用いずとも以下のように切に書くことが可能
なぜこれで良いか
コメント
本家のコードにはenabledがis_enabledとなっているタイポがあったが、とても勉強になった。
出典
小ネタ:Pytorch で Automatic Mixed Precision (AMP) の ON/OFF をするときの話