GENZITSU / UsefulMaterials

34 stars 0 forks source link

weekly useful materials - 10/19 - #73

Open GENZITSU opened 3 years ago

GENZITSU commented 3 years ago

BERTを用いた教師なし文表現

BERTを用いた教師なし文表現ベクトルの獲得方法を提案した論文。 教師あり文ベクトルの獲得手法と同等程度の性能が出るらしい

SimCSEを使うことで、従来の教師ありによる文ベクトルと同等の性能を発揮することが可能です。また、この論文の優れている点として、BERTを使用した場合に精度が悪化する原因まで明らかにした点があります。

背景

教師なしの文類似度タスクの場合、BERTを使って単語をベクトルに変換し、そのベクトルの平均を文のベクトルとするよりも、GloVeなどの単語ベクトルを使用して単語をベクトルに変換した方が良いという状態でした。

手法

手法はシンプルで、同じ文を異なるdropout maskのBERTに入れたものを正例、異なる文をBERTに入れたものは負例となるように対比学習を行う。

スクリーンショット 2021-10-12 15 57 43

結果

文類似度タスクでの実験結果。
素のBERTはgloveに負けているが、提案手法は+10% ~ +20%性能が改善されている。

スクリーンショット 2021-10-13 20 27 16

考察

それでは、なぜこんなにも簡単な方法で精度が改善したのでしょうか。(Ethayarajh, 2019)などによると、BERTによってencodeされるベクトルは、超楕円となっており、ある方向に集中しています。(Wang and Isola, 2020)によると、それが対照学習を行うことによって是正され

l_alignは高いほど文類似度タスクの性能が上がり、l_uniformが高いほど分布が一様に広がっていることを示すもの。
素のBERTはl_alignが高いががl_uniformが低い。提案手法はバランスが良いことがわかる。

スクリーンショット 2021-10-13 20 32 33

日本語データによる追試

NLIタスクに関してはSimCSEによる精度向上が確認された。

スクリーンショット 2021-10-13 20 37 48

クラスタリングに関しては素のBERTの方が良いという結果だった。

スクリーンショット 2021-10-13 20 37 48

コメント

dropoutかけるだけでcontrastive learningが成立するのだろうか...。
とくにaugmentationとかもいらないのか。 とはいえこれが成立するということは、Multi Sample DropoutR-Dropが効くという裏付けにもなるのかな。

出典

元記事

元論文

GENZITSU commented 3 years ago

画像認識向けTransformerを振り返る

vision transformer系の論文が定期的にまとめられているqiita記事

コメント

メモ

出典

元記事

GENZITSU commented 3 years ago

Pytorch LightningでTPUを回す on Colab Pro in 2021

Pytorch Lightningでは以下のように簡単にデバイスを変えた訓練を可能らしい。

# from https://yuta0306.github.io/pytorch-lightning_on_colab-tpu_2021

import pytorch_lightning as pl
# これらは共通
model = LitModel()  # pl.LightningModuleを継承した何か
dm = LitDataset()  # pl.LightningDataModuleを継承した何か

# CPUを使う
trainer = Trainer()
trainer.fit(model, dm)

# GPUを使う
trainer = Trainer(gpus=-1)  # ありったけのGPU使う
trainer.fit(model, dm)

# Single Core TPUを使う
trainer = Trainer(tpu_cores=[5])  # TPUのインデックス指定
trainer.fit(model, dm)

# Multi Core TPUを使う
trainer = Trainer(tpu_cores=8)  # 1 or 8じゃないと怒られます...
trainer.fit(model, dm)

cloabでTPUを使うためには以下のようにpytorch-xlaをインストールする必要があるとのこと

# from https://yuta0306.github.io/pytorch-lightning_on_colab-tpu_2021

!pip install cloud-tpu-client==0.10 https://storage.googleapis.com/tpu-pytorch/wheels/torch_xla-1.8-cp37-cp37m-linux_x86_64.whl
!pip install -q torch==1.8 torchvision torchtext
!pip install -q pytorch-lightning==1.4.9 torchmetrics

注意点としてはRAMの使用率が50%以下になっていないと動かなくなるらしい。

なぜか知らんけど,RAMの使用率が50%あたりになるとstackする こうなると一生動かなくなるので,最初安定するまで監視が必要 Colabの下のデバッガみたいなやつが,ずっとselect() > spawn()的な非同期のところで止まるので,そうなったらRAMチェックしよう!!!

コメント

ブログ記事にはpytorch lightningでDDPが簡単に実行できると書いてあったが、本当だろうか。
DPだったりしない? とはいえ、pytorch lightning楽だなぁこれ。

出典

元記事

GENZITSU commented 3 years ago

Nim で mecab を使ってみた(C++バージョン)

pythonだと遅い(十分早いけど)形態素解析処理をNimを使って早くしようという記事。
特に速度比較していないが、Nimだし早いんじゃないかな。

コメント

後に使うかもしれないのでメモ。

出典

元記事

GENZITSU commented 3 years ago

10 Underrated Sklearn Features You Can Use For Your Advantage Right Now

あまり知られていないsklearnの便利なメソッドなどを紹介している。

自分のためになったものだけメモ

FunctionTransformer

オリジナルの前処理をsklearnのpiplineに取り入れるためのクラス。
引数にXとoptionalなyがあれば良い

# from https://towardsdatascience.com/10-underrated-sklearn-features-you-can-use-for-your-advantage-right-now-3a87b10a8d7f

from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import FunctionTransformer

def reduce_memory(X: pd.DataFrame, y=None):
    """Simple function to reduce memory usage by casting numeric columns to float32."""

    num_cols = X.select_dtypes(incluce=np.number).columns
    for col in num_cols:
        X[col] = X.astype("float32")

    return X, y

ReduceMemoryTransformer = FunctionTransformer(reduce_memory)

# Plug into a pipeline
>>> make_pipeline(SimpleImputer(), ReduceMemoryTransformer)

User-defined transformers

BaseEstimator, TransformerMixinを継承して、オリジナルのsklearnフレンドりなーデータ処理クラスを作ることができる。

# from https://towardsdatascience.com/10-underrated-sklearn-features-you-can-use-for-your-advantage-right-now-3a87b10a8d7f

rom sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import PowerTransformer

class CustomLogTransformer(BaseEstimator, TransformerMixin):
    def __init__(self):
        self._estimator = PowerTransformer()  # init a transformer

    def fit(self, X, y=None):
        X_copy = np.copy(X) + 1  # add one in case of zeroes
        self._estimator.fit(X_copy)

        return self

    def transform(self, X):
        X_copy = np.copy(X) + 1

        return self._estimator.transform(X_copy)  # perform scaling

    def inverse_transform(self, X):
        X_reversed = self._estimator.inverse_transform(np.copy(X))

        return X_reversed - 1  # return subtracting 1 after inverse transform

HTML Estimator Representation

sklearnのpipelineをいい感じの図にしてくれる

# from https://towardsdatascience.com/10-underrated-sklearn-features-you-can-use-for-your-advantage-right-now-3a87b10a8d7f

from sklearn import set_config

set_config(display="diagram")

>>> giant_pipeline

スクリーンショット 2021-10-13 23 41 15

QuadraticDiscriminantAnalysis

使用できる対象の分布が制限されているものの、場合によってはtree系よりもハイパフォーマンスかつ高速に動く分類機 線形判別分析(LDA)の非線形対応バージョンともいう。

Well, its use-case is limited. The features to train QDA should be strictly normally distributed, making it easy for QDA to calculate and fit an ellipsoid shape around the distribution.

n Kaggle Instant Gratification Competition, a Quadratic Discriminant Analysis classifier achieved an impressive 0.965 ROC AUC score even without hyperparameter tuning, exceeding most tree-based models, including XGBoost and LightGBM.

Voting Classifier/Regressor

その名の通り、結構便利そう。というかこいつにfitできるの知らなかった。

# from https://towardsdatascience.com/10-underrated-sklearn-features-you-can-use-for-your-advantage-right-now-3a87b10a8d7f

from sklearn.ensemble import VotingClassifier

X, y = make_classification(n_samples=1000)

ensemble = VotingClassifier(
    estimators=[
        ("xgb", xgb.XGBClassifier(eval_metric="auc")),
        ("lgbm", lgbm.LGBMClassifier()),
        ("cb", cb.CatBoostClassifier(verbose=False)),
    ],
    voting="soft",
    # n_jobs=-1,
)

_ = ensemble.fit(X, y)

Stacking Classifier/Regressor

知らぬ間に簡単に実装できるようになっていた。

# from https://towardsdatascience.com/10-underrated-sklearn-features-you-can-use-for-your-advantage-right-now-3a87b10a8d7f

from sklearn.ensemble import StackingClassifier, StackingRegressor
from sklearn.linear_model import LogisticRegression

X, y = make_classification(n_samples=1000)

ensemble = StackingClassifier(
    estimators=[
        ("xgb", xgb.XGBClassifier(eval_metric="auc")),
        ("lgbm", lgbm.LGBMClassifier()),
        ("cb", cb.CatBoostClassifier(verbose=False)),
    ],
    final_estimator=LogisticRegression(),
    cv=5,
    passthrough=False
    # n_jobs=-1,
)

_ = ensemble.fit(X, y)

QuantileTransformer

分位点をもとに、ヤベー分布をしている特徴量を正規分布or一様分布に変換してくれるもの

# from https://towardsdatascience.com/10-underrated-sklearn-features-you-can-use-for-your-advantage-right-now-3a87b10a8d7f

from sklearn.preprocessing import QuantileTransformer

qt = QuantileTransformer().fit(tps_sep[crazy_features])

tps_sep.loc[:, crazy_features] = qt.transform(tps_sep[crazy_features])
fig, axes = plt.subplots(1, 3, figsize=(20, 6))
crazy_features = ["f18", "f31", "f61"]

for ax, f_name in zip(axes.flatten(), crazy_features):
    sns.kdeplot(tps_sep[f_name], ax=ax, color="#E50914")

スクリーンショット 2021-10-13 23 49 01

スクリーンショット 2021-10-13 23 49 06

コメント

特に一押しはパイプラインをhtml化してくれるやつと、QuadraticDiscriminantAnalysisかな。 こいつがここまでやる子だとはしらなかった。

出典

元記事

GENZITSU commented 3 years ago

sentence transformersで日本語を扱えるモデルのまとめ

sentence transformersという文章ベクトルをBERTで獲得するライブラリ群があるが、そこに実装されている日本語対応のモデルとその特徴がまとめられている。
記事の最後にはそれらの比較検証もなされており、tokenizerが日本語に対応していないものは相応に低い結果となっている。

スクリーンショット 2021-10-14 0 02 56

スクリーンショット 2021-10-14 0 03 06

スクリーンショット 2021-10-14 0 03 13

コメント

メモ

出典

元記事

GENZITSU commented 3 years ago

OOFの予測値でConfident Learning (cleanlab) を使おう!

自前のモデルに対してcleanlabを使うには通常以下のようなsklearnライクなクラスに変換する必要があるのだが、
これはめんどくさいので楽をするための小技が紹介されている。

# from https://qiita.com/ground0state/items/0a1b857c24bf63cece8a)

from sklearn.base import BaseEstimator

class YourFavoriteModel(BaseEstimator): # Inherits sklearn base classifier
    def __init__(self, ):
        pass
    def fit(self, X, y, sample_weight=None):
        pass
    def predict(self, X):
        pass
    def predict_proba(self, X):
        pass
    def score(self, X, y, sample_weight=None):
        pass

# Now you can use your model with `cleanlab`. Here's one example:
from cleanlab.classification import LearningWithNoisyLabels

lnl = LearningWithNoisyLabels(clf=YourFavoriteModel())
lnl.fit(train_data, train_labels_with_errors)

これは回避するためには、CVなどでOOFの訓練データに対する予測値を使う。 そうすると以下のように、class自体はハリボテのままでcleanlabにかけることができるようだ。

# from https://qiita.com/ground0state/items/0a1b857c24bf63cece8a)

# 確率に規格化できてない場合は規格化する
psx = softmax(y_oof, axis=1)

# モデルをラップする
clf = LearningWithNoisyLabels(
    clf=CleanModel(),
    prune_method='prune_by_class' # ここは自由に選ぶ
)
clf.fit(
    X=np.arange(len(train_df)),  # データのid
    s=train_df[y].values,  # クラスラベルの ndarray, shape (n_samples, )
    psx=psx,
    noise_matrix=None,
    inverse_noise_matrix=None,
)

コメント

簡単にcleanlabに突っ込めるようになるのは良いな。

出典

元記事

GENZITSU commented 3 years ago

AIの実業務適用に必須なHITLという考え方と、HITLを加速させるAI×RPA

HITL = Human In The Loop この考え方はAI導入のハードルを下げる意味合いを持つ。

AIにあまり詳しくない業務担当者の方々は、「AIの業務適用」と聞いた時に必要以上に高いハードルをイメージしてしまいがちなのですが、HITLという考え方を持つ事によって、「これなら自分達の業務でも使えるところがあるかも」といった具体的なイメージを持つ事ができるように

よくあるAI導入とHITLの違い

HITLとはAIモデルを静的なものと捉えるのではなく、実際のオペレーションとのインタラクションがあるものと考える。

HITLにはフィードバックループがあり、現時点のAIモデルで対応できずに人が対応した際のデータは、AIモデルの新しい学習データとなり、フィードバックループによってAIモデルが継続してトレーニングされます。つまり、このAIの継続的な学習過程自体がHITLには組み込まれています。 AIで構築したモデルの精度を静的なものと捉えるのではなく、継続的に向上させる対象として考えるのがHITLのポイントになります。

スクリーンショット 2021-10-14 17 47 35

なぜHITLが重要なのか

AIの導入ハードルを低減させると同時に、AIの継続的な精度向上により、最終的なリターンも最大かできるから。

AIを使いながら育てるというHITLの形にする事で、AIの早期導入を可能にしつつ、精度の継続向上により、AI導入のリターンを最大化

また、継続的な精度向上を前提としているので、目標値に達しなければ成果0みたいなことにもならない。

ある精度をAI導入の目標値として設定して、AIモデルを構築しようとする場合、目標にした精度に到達するまではずっと訓練・準備期間となり、この間に得られるリターンはゼロになります。

こちらの考えたかは啓蒙という観点ではよいが、本当に3割カットできるかは慎重に検討する必要がありそう。(逆にオペレーションを増やしかねない)

重要な事はAIの精度がいくらかではなく、業務の役に立つかどうかという事だからです。極端に言ってしまえば、精度3割のAIは、既に業務を3割カットする力を持っています。これは10人で対応していた業務であれば、7人で対応できるようになるという事です。

スクリーンショット 2021-10-14 17 48 38

鍵となる推定信頼度の使い方とUI設計

精度3割という全体の平均精度で議論しないようにしましょうという話。
もしかするとAIの確信度が高い時はあまり間違えていない可能性があるからだ、そこに注目し人間側とAI側でオペレーションを分けることができる。

スクリーンショット 2021-10-14 18 31 48

この時重要なのがUI設計で、結局人間が全てチェックしなくてはならないようなUIだと意味がなくなる。

最悪なUI設計は左の例のように、単純にAIの推定結果だけを返す形です。これでは、AIの精度がどれだけ高かったとしても、1つ1つチェックしなければならないので、ほとんどAIを導入した意味がないに等しいでしょう。

人間とAIのオペレーションの共存を前提にUIを設計する必要がある。

一方、右側の例では推定信頼度を用いた結果の表示によってユーザーの確認・補正が容易となっています。まず、最も可能性が高いクラスの推定信頼度で降順に並べ替えているため、推定信頼度は高いところはざっと確認して、推定信頼度が低い所は重点的に確認といった強弱がつけられるようになります。部下に仕事を任せた場合で言うと、「こことここだけ少し不安なので見て頂けますか?」といったように返してもらう形ですね。

スクリーンショット 2021-10-14 18 32 49

実際にどう業務システムに落とし込むか

人間の一部の業務をAIに任せるためには、御膳立てが必要となる。
このお膳立てをどれだけ自動化・システム化できるかが結構大事になる。

考えなければいけないのはこの辺り

  1. AIモデルへ入力するデータの取得とAIの推論処理の駆動
  2. 人に判断を仰ぐデータの連携とUIを考慮した整形
  3. AIモデルと人の補正データの統合とシステム入力
  4. 人手によって補正されたデータの取得とAIの追加学習処理の駆動

スクリーンショット 2021-10-14 18 37 28

まとめ

AIだからと特別に考える必要はなく、これは新しい部下が入ってきた時と同じ話で、出来るところは任せて、出来ない所は教えてあげれば良いだけです。次第に成長してどんどん仕事を任せられるようになって行くでしょう。

コメント

実務家の視点でAI x HITLについてここまで詳しく書かれた資料はないのではないだろうか。

とても勉強になる

出典

元記事

GENZITSU commented 3 years ago

yoloxのライセンス問題がクリアに

Remove yolov5 codes with new hsv aug and new random affine transform #781 マージ済み

コメント

よかった。

出典

元記事

GENZITSU commented 3 years ago

AIによるラベリングから逃れるためのカモフラージュ」を開発する「UNLABELED」が新作 “人として認識されなくなる”テキスタイルを発表「NEXUSVII.」とのコラボレーション作品も発売決定

テクノロジーを起点とした社会課題の解決や、あたらしい表現開発を実践するDentsu Lab Tokyo(東京都港区)がQosmoと共に立ち上げたテキスタイルレーベル「UNLABELED(アンラベルド)」は、10月22日(金)より開催する日本最大級のデザイン&アートの祭典「DESIGNART TOKYO 2021」に参加。

スクリーンショット 2021-10-14 21 17 19

Adversail Patchという技術をもとに、物体認識されないようにする柄がプリントされた服などが買える。
対象としているはYoLov2だそう。

「AIに人として認識されなくなるカモフラージュ柄*」を用いたスケートボードやフーディ、スウェット、トートバッグなどのプロダクト作品を展示・販売いたします。

柄の生成には、画像や映像に特定の柄を加えることで誤認識を誘発するAdversarial Patchと呼ばれる技術を応用しています。これにより任意の対象へのAIの認識を妨げることや、異なる対象として誤認識させることを可能にします。

*カモフラージュ柄は物体検出モデルYOLOv2をベースに生成しており、すべての監視カメラに対して有効なわけではありません。また、カメラの角度や距離、明るさなどの環境によって結果が異なる場合があります。

コメント

買ってみたいなとおもったが、スウェットが2万~なのは結構高いな...

出典

元記事

公式サイト

GENZITSU commented 3 years ago

ファインチューニングでmBARTの日→英翻訳モデルを作成してhuggingfaceで公開してみた

facebookが公開しているfacebook/mbart-large-cc25というモデルをファインチューニングすることで日英翻訳モデルを作成したという記事。

ただしmbartは巨大なモデルなので、モデルに乗せるためにいろいろ工夫がされている。なお、ファインチューニングに使用したデータはJapanese-English Subtitle Corpus(通称 JESC)

元ネタはこちらのissue

要点としては、25種類の言語のうち必要なのは日本語と英語なので、いらないボキャブラリーとそれに付随する情報は消してしまうことで、モデルサイズが減らせるということ。

新しいボキャブラリーファイルはsentencepieceの再学習でなんとかなるらしい。

# from https://zenn.dev/ken_11/articles/f4c117b55c82c5

import sentencepiece as spm
spm.SentencePieceTrainer.Train("--input=tmp.txt --model_prefix=new_spm_model --vocab_size=64000 --vocabulary_output_piece_score=false --model_type=bpe")

ただし、このままだとfairsqが単語辞書を読めないらしく、加工が必要とのこと。(手順は元記事にて確認)

実際に必要ない情報を消しているコードがこちら embedding層の入力や最終出力を必要な語彙数にだけ制限しているのが肝。

# from https://zenn.dev/ken_11/articles/f4c117b55c82c5

model = MBartForConditionalGeneration.from_pretrained("facebook/mbart-large-cc25")
org_sd = model.state_dict()
resized_sd = model.state_dict()

mapping: List[int] = []
for i in range(len(ft_dict)):
    word = ft_dict[i]
    mapping.append(pre_dict.index(word))

for name in ["model.encoder.embed_tokens.weight", "model.decoder.embed_tokens.weight", "model.shared.weight", "lm_head.weight"]:
    pre_tensor: torch.Tensor = org_sd[name]
    ft_tensor = torch.zeros(
        [len(ft_dict), 1024], dtype=pre_tensor.dtype, layout=pre_tensor.layout, device=pre_tensor.device,
    )
    for ft_i, pre_i in enumerate(mapping):
        ft_tensor[ft_i] = pre_tensor[pre_i]
    resized_sd[name] = ft_tensor
resized_sd["final_logits_bias"] = resized_sd["final_logits_bias"][:, :len(ft_dict)]

config = MBartConfig.from_pretrained("facebook/mbart-large-cc25")
config.vocab_size = len(ft_dict)
print(config)
new_model = MBartForConditionalGeneration.from_pretrained(None, config=config, state_dict=resized_sd)
new_model.save_pretrained("./reduced_model")

これを行うことで、2.3GBあったモデルサイズが、1.6GBまで落ちるとのこと。 この状態で、JSECデータで5epoch回したのが公開されたモデルとのこと。

コメント

公開されている多言語モデルから必要な語彙だけ作り直して、ファインチューニングさせる手はとても面白い。 日本語というマイナー言語のNLPerにとってはありがたい話だと思う。
これに似た話で、多言語BERTは単言語BERTに精度的に勝てないみたいな話があって、ここでもtokenzierのボキャブラリー数で不利になっているという指摘があったので、真っ当なアプローチに思える。 (How Good is Your Tokenizer? On the Monolingual Performance of Multilingual Language Models (ACL2021))

出典

元記事

公開モデル

GENZITSU commented 3 years ago

MediaPipeを使ったARアプリ開発事例 ~カメラをかざして家の中で売れるものを探そう~

スマホ上でAIモデルを動かすための知見が詳細にまとめられている記事。
端的にまとめると、モデルサイズを軽減させたモデルをMediaPipeを使いながら、効率的に推論させようという取り組み。

スクリーンショット 2021-10-14 23 00 29

ちなみにmediapipeというのはこれで、推論処理のパイプラインを最も遅い部分に合わせてうまくスケジューリングしてくれるやつ。無駄がないので早い。

スクリーンショット 2021-10-14 22 44 06

スクリーンショット 2021-10-14 22 44 18

スマホにAIモデルをデプロイする時は、モデル自体のサイズと計算量が問題になる。

ここではまずモデルサイズの軽量化ということで、検出クラス数の制限、quantization & tflite化などが行われている。
これらを施すことで、モデルサイズが17MB→12MB→6MBになったとのこと

スクリーンショット 2021-10-14 23 02 40(2)

スクリーンショット 2021-10-14 23 02 45

スクリーンショット 2021-10-14 23 02 51

スクリーンショット 2021-10-14 23 03 04

スクリーンショット 2021-10-14 23 03 20

計算量という観点では、マイフレーム計算する必要はないので効率的にサボるということをやっており、最終的には特徴抽出処理はサーバーで行いレスポンス速度はUIでカバーということを行なった。 (特徴抽出をサーバーに持っていったのは消費電力の問題ではなくアプリサイズの問題らしい)

スクリーンショット 2021-10-14 23 07 01

スクリーンショット 2021-10-14 23 07 14

スクリーンショット 2021-10-14 23 07 28

コメント

この事例については、6月ごろに一度まとめた覚えがある、あの時からの差分としては特徴抽出処理をサーバーに切り離したところと、モデルの重複問題くらいかな。

出典

元記事

GENZITSU commented 3 years ago

AIOpsの研究動向と
AIOps向けデータセットの動的生成の研究

AIを用いてITサービスの運用を自動化・らくにしようという研究の最近の動向がまとめられている。

以下のように概要や代表的なアプローチが述べられている

スクリーンショット 2021-10-14 23 52 49

スクリーンショット 2021-10-14 23 52 59

スクリーンショット 2021-10-14 23 53 06

スクリーンショット 2021-10-14 23 53 12

スクリーンショット 2021-10-14 23 53 18

コメント

メモ

出典

元記事

GENZITSU commented 3 years ago

Transformer 動向調査 in 画像認識

Vision Transfomerの概要とそれが持つ課題と対策、CNNとの違いなどがまとめられている。2021年10月版としてはちょうど良い網羅具合だと思う。

コメント

メモ

出典

元記事

GENZITSU commented 3 years ago

My Logging Best Practices

ためになった箇所だけ抜粋

ログは処理の後に発砲させる。

スクリーンショット 2021-10-15 22 01 36

parametersとメッセージを分割する

スクリーンショット 2021-10-15 22 01 51

コメント

パラメータとメッセージを分割するのは、確かに後のログ調査が捗りそう。

出典

元記事

GENZITSU commented 3 years ago

textlint で日本語の文章を校正する方法

文章の構成を自動で行ってくれるツールrtextlintの紹介。

スクリーンショット 2021-10-15 22 24 47

インストールにはnpm or yarnが必要。 インストール後に使用したいルールを追加でインストールする必要があるのに注意。

コメント

ドキュメントを書く機会が増えてくると誤字の修正や句読点のつけ忘れなどを気になってくるので、 こういうツールで自動でチェックできるようになるのは便利そう。

出典

[元記事]()

GENZITSU commented 3 years ago

CGと現実の乖離を解釈可能な形で埋める敵対的な方法

CG画像を用いた教師データの生成は、時間とお金をかけずに大量の学習データを用意できる点で魅力的。
しかし、現実世界とのギャップが学習に悪影響を及ぼすことが知られている。

これを解決するための代表的なアプローチが以下二つ

  1. augmentation

    CG 画像を現実の画像に近づけるようにある程度確率的に変換をかけ, CG 画像に多様性を持たせ, DNN の汎化能力を上げようとする手法です [9]. 変換は例えば輝度・コントラストの調整, ノイズの付加, フィルタの適用, 露出補正などがあります. しかしながらどの程度の変換をかけるのかはドメインにセンシティブな問題を持っています.

  2. Style transformation

    Generative Adversarial Networks (GAN) を用いて CG 画像を現実の画像に変換する手法です. この手法は augmentation で挙げられたようなシンプルな変換手法に比べてより強力な変換が期待でき, また変換時に人間がレンジを設定する必要がない (トレーニング時に正則化項などを調整する必要はあります) という点が嬉しいです. しかし GAN を用いた style transformation は時として画像に含まれるオブジェクト自体を壊してしまい, 画像の意味を変えてしまいます.

というな中で今回の提案方法

CG 画像と現実の画像の間に存在する gap を人間が理解できるような形で埋める方法を提案します.

すなわち、CG画像に対して人げに解釈可能なパラメトリックな変換を掛け合わせていくことで、現実に近い画像に変換することを目指す。 (すなわちか?)

一応以下のような整理らしい。 スクリーンショット 2021-10-15 23 09 11

Styleの修正について

構成としては以下のような2部構成で行う。

  1. CGと本物の画像を見分けるDiscriminatorを作成
  2. Discriminatorを欺けるようなCG→本物画像への変換を行うManipulatorを学習

スクリーンショット 2021-10-15 23 10 13

Manipulatorの学習は、以下のようにManipulationを操作することで勾配法での学習を可能にしている。

スクリーンショット 2021-10-15 23 13 09

また、ベースとなる操作はこんな感じで、結局はAugmentationの自動設計みたいな感じ

スクリーンショット 2021-10-15 23 14 33

さまざまな比較実験を行っているが、majorな結果としては以下
変換によってDiscriminatorの騙しやすさが異なる模様。

スクリーンショット 2021-10-15 23 15 51

スクリーンショット 2021-10-15 23 17 35

しかし残念なことにこれで生成したデータを入れても精度は向上しなかったとのこと

スクリーンショット 2021-10-15 23 20 32

原因としては、DiscriminatorがCGとリアル画像を分類する際に用いていた特徴量が悪かったのではという考察をしていた。 元々使用していたCG/リアルデータセットに関しても、スタイル以外の違いがあったことや、manipulationを分布からのサンプリングすればより良かったと考察されていた。

コンテンツの操作

CGで配置した物体をリアルっぽく、配置し直すタスクを行っている。 スタイル変換との違いは、blenderを通すために勾配法が使えず、optunaを用いたblack box 最適化を行っているという点。

スクリーンショット 2021-10-15 23 23 26

この実験をするためには、コンテンツの配置以外は全く同じであるデータセットを用意する必要があるため、以下のような工夫を実施した。

こで私達は完全に同じスタイルを持つように二つの CG データセットを用いることにしました. 一つは CG データセットであることを模した CG データセット, もう一つは リアルデータセットであることを模した CGデータセットです. 例えば後述する実験1ではペットボトルが横に置かれているデータセットと縦に置かれているデータセットの二つを用意しています. このうち前者が CG データセットであることを想定したもので, 後者がリアルデータセットであることを想定したものです

しかし、いくつかの実験をしてみたもののこの取り組みはうまくいかなかったとのこと。

スクリーンショット 2021-10-15 23 27 51

真っ直ぐ縦にならない

スクリーンショット 2021-10-15 23 28 28

スクリーンショット 2021-10-15 23 28 44

上だけきちんとしてる

スクリーンショット 2021-10-15 23 29 09

スクリーンショット 2021-10-15 23 28 59

今度は上がぶっ壊れる。

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

コンテンツ操作の問題は、out-of-distributionの問題やdiscriminatorのチートなど対処しなくてはいけない問題が多くて大変そうだ。

コメント

このタスクDiscriminatorがどれくらいまともかに依存してくると思うので、そいつの学習をしっかりしないとダメな気がする。
DeepFake検出に顔特徴量の一部しか使われていなかった論文よろしく、一部をマスクした状態で見分けられる程度には強くしないとダメなのかも。ちなみにこの論文では、偽物かどうかを見分けるDiscriminatorのAttention Weightをもとにそこを隠してしまうことで、強制的に別の箇所からも分類できるようにさせる手法だそうです。

スクリーンショット 2021-10-17 13 49 49 スクリーンショット 2021-10-17 13 50 32

出典

元記事

GENZITSU commented 3 years ago

銃器装備の犬型ロボットが登場、「来るべき時が来た」と海外紙

このロボットは、アメリカのGhost Roboticsが開発した「Vision 60」という四足歩行ロボットに、個人携行用銃器を専門とするSWORD Internationalが製造した、ロボットプラットフォームに取り付る用途の専用の銃器「Special Purpose Unmanned Rifle(SPUR)」を装着したもの。SPURは30倍光学ズーム・暗視用サーマルカメラを備えており、有効射程は1200メートルとのことです。

四足歩行ロボット「Spot」の知名度によって四足歩行ロボット業界最大手と評されるボストン・ダイナミクスは、軍事運用を禁じる厳格なルールを設けていますが、当然ながら全てのメーカーがこうしたルールを設けているわけではありません。The Vergeは多くの団体が求めているにもかかわらず(PDFファイル)アメリカの公式政策が自律型致死兵器システムに関する開発や販売を禁止していない点を指摘し、来るべき時が来た

スクリーンショット 2021-10-17 13 58 39

コメント

こわい

出典

元記事

GENZITSU commented 3 years ago

LightGBMをGPUで使うのが簡単になってた件

簡単になっていた件というタイトルだが、いろいろインストールする必要があり、そこまで簡単ではない様子だった。
そのくせGPUを使用してもLGBMはそこまで早くならないらしい。

GPUをうまく使いたいなら、CatBoostが良いみたいで、ちゃんとGPUも使ってくれるししっかり早くなるみたい。

# from https://qiita.com/tanreinama/items/5e3eca5cf5e01169e5da

model = CatBoostClassifier( iterations = ...,
                            custom_metric = ...,
                            max_bin=800,
                            task_type='GPU')
eval_dataset = Pool(X_val,y_val,cat_features = [...])
model.fit(X,
          y,
          cat_features=[...],
          eval_set=eval_dataset,
          early_stopping_rounds = ...,
          verbose_eval = ...)
スクリーンショット 2021-10-17 14 08 03

コメント

NBIDIA RAPIDSのXGBoostもたしかGPUを効かせられたような気がする。どっちの方が簡単なんだろう。

出典

元記事

GENZITSU commented 3 years ago

コミュニティサービスにおけるレコメンデーションの変遷とMLパイプラインについて

育児系情報コミニュティサービスにおける、質問記事のレコメンデーションをどのように実装していったかの変遷とそれをどのように提供しているかの紹介。

今回は変遷の方が面白いのでそちらだけ要約。

1. Matrix Factorization

スクリーンショット 2021-10-17 14 15 04 スクリーンショット 2021-10-17 14 15 12

このアプローチではベースラインの精度を超えられず、導入は至らなかったとのこと。
原因としては、質問カテゴリが不均衡になっていたことで、特定のジャンルの質問ばかりが優先的に推薦されていたからとのこと。

  1. トピックモデル

同じカテゴリでも、趣向が違う質問が結構多かったため、トピックモデルによる推薦を試した。

記事集合に対してgensimでトピックモデルを学習し、そこからユーザーの興味ベクトルを算出することで推薦を行う。

スクリーンショット 2021-10-17 14 20 47

このアプローチはベースラインと同等の性能を出すことができたのだが、ユーザーのベクトルを作るのが計算量的に高くつくだったり、質問の多様性が高くないという問題があったとのこと。

スクリーンショット 2021-10-17 14 22 02
  1. NNなレコメンデーション

お馴染みのやつ。

スクリーンショット 2021-10-17 14 24 47

ただ、質問ベクトルの作り方が面白かった。 質問IDのの閲覧系列からベクトル作ることで、結構いい感じのベクトルが作れたらしい。

スクリーンショット 2021-10-17 14 26 31 スクリーンショット 2021-10-17 14 26 39 スクリーンショット 2021-10-17 14 26 49

このアプローチではベースラインの精度を還元にout performすることができ見事運用に乗ったとのこと。

コメント

普通はWord2VecとかBERTとかに突っ込みそうなところを、質問IDの系列でいい感じの質問ベクトルが作れるのは面白い。

出典

元記事

GENZITSU commented 3 years ago

Vertex Pipelines ではじめるサーバーレス機械学習パイプライン

Vertex Pipelinesの基本的な使い方と前処理→モデル学習→後処理のサンプルパイプラインを作るためのコードが紹介されている。

コメント

今すぐ必要というわけではないが年のためメモ。

出典

元記事

GENZITSU commented 3 years ago

High Performance FastAPI

FastAPIで立てたAPIのパフォーマンスを100rpsを目標にチューニングし、結果250rpsまで向上させた事例の紹介。

チューニングの前に計測

スクリーンショット 2021-10-17 17 57 53

Locustで負荷をかけ、DataDogでシステム全体のパフォーマンスを測定し、fastapi_profilerとpy-spyでアプリの性能を計測する。 ただし、DataDog APMは機能が充実しているもの高かったり、fastapi_profilerはプロファイイングをすることによる性能劣化が無視できないとのこと。
一方でpy-spyはrustで書かれている低オーバヘッドなプロファイラーで、api以外のスレッドについても計測してくれるので便利とのこと。

スクリーンショット 2021-10-17 18 10 20 スクリーンショット 2021-10-17 18 10 31 スクリーンショット 2021-10-17 18 10 38 スクリーンショット 2021-10-17 18 10 45 スクリーンショット 2021-10-17 18 10 54

チューニング

アプリの構成

スクリーンショット 2021-10-17 18 13 41

遭遇した課題

スクリーンショット 2021-10-17 18 14 20

I/Oバウンド

スクリーンショット 2021-10-17 18 15 07 スクリーンショット 2021-10-17 18 15 58 スクリーンショット 2021-10-17 18 16 07

CPU Bound

スクリーンショット 2021-10-17 18 16 13 スクリーンショット 2021-10-17 18 16 20 スクリーンショット 2021-10-17 18 16 32 スクリーンショット 2021-10-17 18 16 40

MultiThreadが遅い

スクリーンショット 2021-10-17 18 16 48 スクリーンショット 2021-10-17 18 17 06

CPythonの処理系自体が遅い

スクリーンショット 2021-10-17 18 17 15 スクリーンショット 2021-10-17 18 17 22 スクリーンショット 2021-10-17 18 17 29 スクリーンショット 2021-10-17 18 17 40

コメント

FastAPIと題されているものの、テクニック自体は汎用的なものなので、取り入れていきたい。 特にpy-spyは以下のように簡単に使えるので便利そう。

# from https://github.com/benfred/py-spy

py-spy record -o profile.svg --pid 12345
# OR
py-spy record -o profile.svg -- python myprogram.py

出典

元記事

GENZITSU commented 3 years ago

onnxruntime-web-demo

ONNXに変換したモデルをWASMやWebGLをつかってブラウザで動作させるデモページ。 ウェブページ単体で動作するので、サーバーにリクエストする必要がなくなるのがメリット。

ONNX Runtime Web is a Javascript library for running ONNX models on browsers and on Node.js.

ONNX Runtime Web has adopted WebAssembly and WebGL technologies for providing an optimized ONNX model inference runtime for both CPUs and GPUs.

mobilenetでであればCPUでも40msで推論することができる。

スクリーンショット 2021-10-17 20 29 33

コメント

webブラウザで処理が簡潔できるようになると情報セキュリティが厳しい案件の時は良いかも。

出典

元記事

ONNX Runtime Web

demoのgithub

GENZITSU commented 3 years ago

SciTLDR

TLDR: Extreme Summarization of Scientific Documentsという論文の著者実装。

このレポジトリでは3,200の科学論文とそれに対応した5.400の要約のデータが付属している。
このデータ自体はOpenReviewの著者要約とレビュアーコメントをアノテーターが要約した文が正解となっていて、学習を高速化させるために、タイトル生成をmulti task的にとかしている。

スクリーンショット 2021-10-17 21 05 05 スクリーンショット 2021-10-17 21 05 30

コメント

デモページで動作を確認しようと思ったら動かなかった。。。 著者要約をそのまま使わないで、レビュワーコメントも用いているので高品質な要約生成が期待できそう。

出典

元記事

デモページ

GENZITSU commented 3 years ago

Big Self-Supervised Models Advance Medical Image Classifications

自己教師あり学習を医療ドメインに適用し、教師あり学習よりも好成績を収めたという報告。

Specifically, we demonstrate that self-supervised pre-training outperforms supervised pre-training, even when the full ImageNet dataset (14M images and 21.8K classes) is used for supervised pre-training.

提案手法
普通の手法と違う点は、医療画像は同じ患者から複数の診察画像を取得できるのでそれらを正例ペアとして使用することが可能な点。

MICLe does not require class label information and only relies on different images of an underlying pathology, the type of which may be unknown.

スクリーンショット 2021-10-17 22 28 15

その結果がこちら。教師あり学習よりも最終性能が高く、必要なラベル数も少なく済む。

スクリーンショット 2021-10-17 22 31 14 スクリーンショット 2021-10-17 23 41 02 スクリーンショット 2021-10-17 23 14 29

詳しい手法

Imagenetと医療画像のself supervised learning手法の違いはどうもないような書かれかたをしていた。
これの他にfine tuningの方法についても書かれていたがあまり特別なことは書かれていなかった。どうも採用するaugmentationの種類が大事らしい。

Following SimCLR, two fully connected layers are used to map the output of ResNets to a 128-dimensional embedding, which is used for contrastive learning. We also use LARS optimize to stabilize training during pretraining.

we use the same data augmentation used to generate positive pairs in SimCLR. This includes random color augmentation (strength=1.0), crops with resize, Gaussian blur, and random flips. We find that the batch size of 512 and learning rate of 0.3 works well in this setting. Using this protocol, all of models were pretrained up to 150,000 steps

In all of our pretraining experiments, images are resized to 224 × 224. We use 16 to 64 Cloud TPU cores depending on the batch size for pretraining. With 64 TPU cores, it takes ∼12 hours to pretrain a ResNet-50 (1×) with batch size 512 and for 100 epochs.

コメント

self-supervised-learningを複数データセットで行うというアプローチが面白い。
imagenetを使う旨味が実は、片方のデータセットでしか発揮されていないのが少し残念。
確かに皮膚の方の画像とx線の画像だと、前者の方がimagenetに近い気がするのでそれが効いている...? しっかしSSLの学習時間が12時間というのはたまげたなぁ。

出典

元論文

紹介記事

GENZITSU commented 3 years ago

Pytorch Template 個人的ベストプラクティス(解説付き)

ライブラリのインポートからDataLoaderの設定、モデルの設定、学習/評価までの全コードに対するベストプラクティステンプレートの紹介。

個人的に気になった要素だけメモる。

DataLoaderごとに異なる乱数seedを設定する

# from https://qiita.com/takubb/items/7d45ae701390912c7629

# データローダーのサブプロセスの乱数seedが固定
def worker_init_fn(worker_id):
    np.random.seed(np.random.get_state()[1][0] + worker_id)

# データローダーの作成
train_loader = torch.utils.data.DataLoader(train_dataset,
                                           batch_size=16,  # バッチサイズ
                                           shuffle=True,  # データシャッフル
                                           num_workers=2,  # 高速化
                                           pin_memory=True,  # 高速化
                                           worker_init_fn=worker_init_fn
                                           )

コメント

意外と一個しかなかった。 worker_init_fnは結構忘れやすいので、気をつけないといけない。
詳しくはこの記事を参照

出典

元記事

GENZITSU commented 3 years ago

【VScode】pytestによる単体テスト実行 & カバレッジ可視化方法

pytestとvscode拡張のpython, pytest-covを入れることで、vscode上でテストの実行と、テストされたコードの可視化を行うことができる。

スクリーンショット 2021-10-18 19 39 39

コメント

便利そうなのでメモ

出典

元記事

GENZITSU commented 3 years ago

GROKKING: GENERALIZATION BEYOND OVERFITTING ON SMALL ALGORITHMIC DATASETS

訓練データセットに対して過学習している状態がしばらく続いた後に、突然validationデータに対して汎化する、grokkingという現象を発見。

In some situations we show that neural networks learn through a process of “grokking” a pattern in the data, improving generalization performance from random chance level to perfect generalization, and that this improvement in generalization can happen well past the point of overfitting.

さらにデータセットサイズが小さければ小さいほど、汎化に時間がかかる現象も発見。

We also study generalization as a function of dataset size and find that smaller datasets require increasing amounts of optimization for generalization

スクリーンショット 2021-10-18 19 48 26

実験に用いたデータセットは数独パズル的な論理演算データ。

Training a neural network on a proper subset of all possible equations then amounts to filling in the blanks of the binary op table, much like solving a Sudoku puzzle.

このタスクにおいてはweight decayの貢献が大きかったとのこと。

We compare various optimization details to measure their impact on data efficiency. We find that weight decay is particularly effective at improving generalization on the tasks we study.

スクリーンショット 2021-10-18 19 50 53

コメント

weight decayは大事なんだな。 実際に学習を行うときは訓練誤差が張り付いててもしばらくは粘る必要があるのだろうか

出典

元記事

GENZITSU commented 3 years ago

クラウド上でアルゴリズムを素早くセキュアに顧客に提供するためのインフラ基盤 (AWS Transit Gatewayを活用した構築パターン)

AWS Transit Gatewayを用いて、以下を同時に達成することで、スピーディに商用提供用の環境構築を可能にした事例の紹介。

  • 顧客毎に利用するAWSアカウントをわけ、顧客データにアクセスできるメンバーをプロジェクトメンバーに限定する
  • 一方で認証や監視等の共通基盤はまとめる

AWS Transit Gateway

AWS Transit Gatewayは、AWSアカウントをまたぐネットワーク(VPC)やオンプレミスを含めた異なるネットワークを一つの中央ハブで接続して通信、通信制御出来る仕組みです。特徴として以下の項目が挙げられます。

  • VPC間接続を簡単に管理するためのシンプルなリージョナルゲートウェイ
  • 数千のVPC, VPN, DirectConnectを接続可能
  • アタッチメントごとのルーティングを可能にするルーティングドメインのサポート

スクリーンショット 2021-10-18 20 05 51

アルゴリズム単体を利用する場合

スクリーンショット 2021-10-18 20 07 43

hared serviceで基本的な認証や利用ログ等を含む共通的なFront画面とAPIを提供しており、shared serviceからアルゴリズムリポジトリテーブルを参照してアルゴリズムのendpointを特定しTransit Gatewayを経由してアルゴリズム推論を実行します。

フルサービスを提供する場合

スクリーンショット 2021-10-18 20 09 19

推論だけではなくて何らかの個別のドメインデータを持ってサービスを提供する場合はオーソドックスに顧客アカウントでサービスを構築します。この場合はshared serviceの認証や利用ログ等マイクロサービスで提供される機能を必要に応じて利用できます

コメント

認証認可や利用状況のモニタリングなどの要素をPRJ/顧客環境ごとに作るのは確かに非効率的なので、
そこを共通化しつつ、分けなければいけないところは分けて、AWS TGW繋いでしまうというのは確かに良いアプローチに思える。

出典

元記事

GENZITSU commented 3 years ago

ベイズ最適化 & 転移学習の体系的な資料

いずれも200p近くあるということで、とても重厚

コメント

メモ

出典

ベイズ最適化

転移学習

GENZITSU commented 3 years ago

Keypoint Communities

なんかとてつもなくすごいkeypoint検出器がICCV2021にて発表されていた。

スクリーンショット 2021-10-18 21 30 12

手法はどういったものかよくわからないが、keypointの検出をした後にグラフ構造の修正を行なっているみたい。

スクリーンショット 2021-10-18 21 31 32

スクリーンショット 2021-10-18 21 31 55

検出率も高め

スクリーンショット 2021-10-18 21 34 19

コメント

個人的には上半身だけでもkeypoint抽出できるのがすごいなぁと。
モデルもMITライセンスで配布されているので、何かに使えるかもしれない。

ただしデモページを動かした感じ結構重そう。

出典

論文

github

デモページ