Open GENZITSU opened 3 years ago
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楽だなぁこれ。
pythonだと遅い(十分早いけど)形態素解析処理をNimを使って早くしようという記事。
特に速度比較していないが、Nimだし早いんじゃないかな。
後に使うかもしれないのでメモ。
あまり知られていないsklearnの便利なメソッドなどを紹介している。
自分のためになったものだけメモ
オリジナルの前処理を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)
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
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
使用できる対象の分布が制限されているものの、場合によっては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.
その名の通り、結構便利そう。というかこいつに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)
知らぬ間に簡単に実装できるようになっていた。
# 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)
分位点をもとに、ヤベー分布をしている特徴量を正規分布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")
特に一押しはパイプラインをhtml化してくれるやつと、QuadraticDiscriminantAnalysisかな。 こいつがここまでやる子だとはしらなかった。
sentence transformersという文章ベクトルをBERTで獲得するライブラリ群があるが、そこに実装されている日本語対応のモデルとその特徴がまとめられている。
記事の最後にはそれらの比較検証もなされており、tokenizerが日本語に対応していないものは相応に低い結果となっている。
メモ
自前のモデルに対して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に突っ込めるようになるのは良いな。
HITL = Human In The Loop この考え方はAI導入のハードルを下げる意味合いを持つ。
AIにあまり詳しくない業務担当者の方々は、「AIの業務適用」と聞いた時に必要以上に高いハードルをイメージしてしまいがちなのですが、HITLという考え方を持つ事によって、「これなら自分達の業務でも使えるところがあるかも」といった具体的なイメージを持つ事ができるように
HITLとはAIモデルを静的なものと捉えるのではなく、実際のオペレーションとのインタラクションがあるものと考える。
HITLにはフィードバックループがあり、現時点のAIモデルで対応できずに人が対応した際のデータは、AIモデルの新しい学習データとなり、フィードバックループによってAIモデルが継続してトレーニングされます。つまり、このAIの継続的な学習過程自体がHITLには組み込まれています。 AIで構築したモデルの精度を静的なものと捉えるのではなく、継続的に向上させる対象として考えるのがHITLのポイントになります。
AIの導入ハードルを低減させると同時に、AIの継続的な精度向上により、最終的なリターンも最大かできるから。
AIを使いながら育てるというHITLの形にする事で、AIの早期導入を可能にしつつ、精度の継続向上により、AI導入のリターンを最大化
また、継続的な精度向上を前提としているので、目標値に達しなければ成果0みたいなことにもならない。
ある精度をAI導入の目標値として設定して、AIモデルを構築しようとする場合、目標にした精度に到達するまではずっと訓練・準備期間となり、この間に得られるリターンはゼロになります。
こちらの考えたかは啓蒙という観点ではよいが、本当に3割カットできるかは慎重に検討する必要がありそう。(逆にオペレーションを増やしかねない)
重要な事はAIの精度がいくらかではなく、業務の役に立つかどうかという事だからです。極端に言ってしまえば、精度3割のAIは、既に業務を3割カットする力を持っています。これは10人で対応していた業務であれば、7人で対応できるようになるという事です。
精度3割という全体の平均精度で議論しないようにしましょうという話。
もしかするとAIの確信度が高い時はあまり間違えていない可能性があるからだ、そこに注目し人間側とAI側でオペレーションを分けることができる。
この時重要なのがUI設計で、結局人間が全てチェックしなくてはならないようなUIだと意味がなくなる。
最悪なUI設計は左の例のように、単純にAIの推定結果だけを返す形です。これでは、AIの精度がどれだけ高かったとしても、1つ1つチェックしなければならないので、ほとんどAIを導入した意味がないに等しいでしょう。
人間とAIのオペレーションの共存を前提にUIを設計する必要がある。
一方、右側の例では推定信頼度を用いた結果の表示によってユーザーの確認・補正が容易となっています。まず、最も可能性が高いクラスの推定信頼度で降順に並べ替えているため、推定信頼度は高いところはざっと確認して、推定信頼度が低い所は重点的に確認といった強弱がつけられるようになります。部下に仕事を任せた場合で言うと、「こことここだけ少し不安なので見て頂けますか?」といったように返してもらう形ですね。
人間の一部の業務をAIに任せるためには、御膳立てが必要となる。
このお膳立てをどれだけ自動化・システム化できるかが結構大事になる。
考えなければいけないのはこの辺り
- AIモデルへ入力するデータの取得とAIの推論処理の駆動
- 人に判断を仰ぐデータの連携とUIを考慮した整形
- AIモデルと人の補正データの統合とシステム入力
- 人手によって補正されたデータの取得とAIの追加学習処理の駆動
AIだからと特別に考える必要はなく、これは新しい部下が入ってきた時と同じ話で、出来るところは任せて、出来ない所は教えてあげれば良いだけです。次第に成長してどんどん仕事を任せられるようになって行くでしょう。
実務家の視点でAI x HITLについてここまで詳しく書かれた資料はないのではないだろうか。
とても勉強になる
Remove yolov5 codes with new hsv aug and new random affine transform #781 マージ済み
よかった。
テクノロジーを起点とした社会課題の解決や、あたらしい表現開発を実践するDentsu Lab Tokyo(東京都港区)がQosmoと共に立ち上げたテキスタイルレーベル「UNLABELED(アンラベルド)」は、10月22日(金)より開催する日本最大級のデザイン&アートの祭典「DESIGNART TOKYO 2021」に参加。
Adversail Patchという技術をもとに、物体認識されないようにする柄がプリントされた服などが買える。
対象としているはYoLov2だそう。
「AIに人として認識されなくなるカモフラージュ柄*」を用いたスケートボードやフーディ、スウェット、トートバッグなどのプロダクト作品を展示・販売いたします。
柄の生成には、画像や映像に特定の柄を加えることで誤認識を誘発するAdversarial Patchと呼ばれる技術を応用しています。これにより任意の対象へのAIの認識を妨げることや、異なる対象として誤認識させることを可能にします。
*カモフラージュ柄は物体検出モデルYOLOv2をベースに生成しており、すべての監視カメラに対して有効なわけではありません。また、カメラの角度や距離、明るさなどの環境によって結果が異なる場合があります。
買ってみたいなとおもったが、スウェットが2万~なのは結構高いな...
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))
スマホ上でAIモデルを動かすための知見が詳細にまとめられている記事。
端的にまとめると、モデルサイズを軽減させたモデルをMediaPipeを使いながら、効率的に推論させようという取り組み。
ちなみにmediapipeというのはこれで、推論処理のパイプラインを最も遅い部分に合わせてうまくスケジューリングしてくれるやつ。無駄がないので早い。
スマホにAIモデルをデプロイする時は、モデル自体のサイズと計算量が問題になる。
ここではまずモデルサイズの軽量化ということで、検出クラス数の制限、quantization & tflite化などが行われている。
これらを施すことで、モデルサイズが17MB→12MB→6MBになったとのこと
計算量という観点では、マイフレーム計算する必要はないので効率的にサボるということをやっており、最終的には特徴抽出処理はサーバーで行いレスポンス速度はUIでカバーということを行なった。 (特徴抽出をサーバーに持っていったのは消費電力の問題ではなくアプリサイズの問題らしい)
この事例については、6月ごろに一度まとめた覚えがある、あの時からの差分としては特徴抽出処理をサーバーに切り離したところと、モデルの重複問題くらいかな。
AIを用いてITサービスの運用を自動化・らくにしようという研究の最近の動向がまとめられている。
以下のように概要や代表的なアプローチが述べられている
メモ
Vision Transfomerの概要とそれが持つ課題と対策、CNNとの違いなどがまとめられている。2021年10月版としてはちょうど良い網羅具合だと思う。
メモ
ためになった箇所だけ抜粋
パラメータとメッセージを分割するのは、確かに後のログ調査が捗りそう。
文章の構成を自動で行ってくれるツールrtextlintの紹介。
インストールにはnpm or yarnが必要。 インストール後に使用したいルールを追加でインストールする必要があるのに注意。
ドキュメントを書く機会が増えてくると誤字の修正や句読点のつけ忘れなどを気になってくるので、 こういうツールで自動でチェックできるようになるのは便利そう。
[元記事]()
CG画像を用いた教師データの生成は、時間とお金をかけずに大量の学習データを用意できる点で魅力的。
しかし、現実世界とのギャップが学習に悪影響を及ぼすことが知られている。
これを解決するための代表的なアプローチが以下二つ
augmentation
CG 画像を現実の画像に近づけるようにある程度確率的に変換をかけ, CG 画像に多様性を持たせ, DNN の汎化能力を上げようとする手法です [9]. 変換は例えば輝度・コントラストの調整, ノイズの付加, フィルタの適用, 露出補正などがあります. しかしながらどの程度の変換をかけるのかはドメインにセンシティブな問題を持っています.
Style transformation
Generative Adversarial Networks (GAN) を用いて CG 画像を現実の画像に変換する手法です. この手法は augmentation で挙げられたようなシンプルな変換手法に比べてより強力な変換が期待でき, また変換時に人間がレンジを設定する必要がない (トレーニング時に正則化項などを調整する必要はあります) という点が嬉しいです. しかし GAN を用いた style transformation は時として画像に含まれるオブジェクト自体を壊してしまい, 画像の意味を変えてしまいます.
というな中で今回の提案方法
CG 画像と現実の画像の間に存在する gap を人間が理解できるような形で埋める方法を提案します.
すなわち、CG画像に対して人げに解釈可能なパラメトリックな変換を掛け合わせていくことで、現実に近い画像に変換することを目指す。 (すなわちか?)
一応以下のような整理らしい。
構成としては以下のような2部構成で行う。
Manipulatorの学習は、以下のようにManipulationを操作することで勾配法での学習を可能にしている。
また、ベースとなる操作はこんな感じで、結局はAugmentationの自動設計みたいな感じ
さまざまな比較実験を行っているが、majorな結果としては以下
変換によってDiscriminatorの騙しやすさが異なる模様。
しかし残念なことにこれで生成したデータを入れても精度は向上しなかったとのこと
原因としては、DiscriminatorがCGとリアル画像を分類する際に用いていた特徴量が悪かったのではという考察をしていた。 元々使用していたCG/リアルデータセットに関しても、スタイル以外の違いがあったことや、manipulationを分布からのサンプリングすればより良かったと考察されていた。
CGで配置した物体をリアルっぽく、配置し直すタスクを行っている。 スタイル変換との違いは、blenderを通すために勾配法が使えず、optunaを用いたblack box 最適化を行っているという点。
この実験をするためには、コンテンツの配置以外は全く同じであるデータセットを用意する必要があるため、以下のような工夫を実施した。
こで私達は完全に同じスタイルを持つように二つの CG データセットを用いることにしました. 一つは CG データセットであることを模した CG データセット, もう一つは リアルデータセットであることを模した CGデータセットです. 例えば後述する実験1ではペットボトルが横に置かれているデータセットと縦に置かれているデータセットの二つを用意しています. このうち前者が CG データセットであることを想定したもので, 後者がリアルデータセットであることを想定したものです
しかし、いくつかの実験をしてみたもののこの取り組みはうまくいかなかったとのこと。
真っ直ぐ縦にならない
上だけきちんとしてる
今度は上がぶっ壊れる。
コンテンツ操作の問題は、out-of-distributionの問題やdiscriminatorのチートなど対処しなくてはいけない問題が多くて大変そうだ。
このタスクDiscriminatorがどれくらいまともかに依存してくると思うので、そいつの学習をしっかりしないとダメな気がする。
DeepFake検出に顔特徴量の一部しか使われていなかった論文よろしく、一部をマスクした状態で見分けられる程度には強くしないとダメなのかも。ちなみにこの論文では、偽物かどうかを見分けるDiscriminatorのAttention Weightをもとにそこを隠してしまうことで、強制的に別の箇所からも分類できるようにさせる手法だそうです。
このロボットは、アメリカのGhost Roboticsが開発した「Vision 60」という四足歩行ロボットに、個人携行用銃器を専門とするSWORD Internationalが製造した、ロボットプラットフォームに取り付る用途の専用の銃器「Special Purpose Unmanned Rifle(SPUR)」を装着したもの。SPURは30倍光学ズーム・暗視用サーマルカメラを備えており、有効射程は1200メートルとのことです。
四足歩行ロボット「Spot」の知名度によって四足歩行ロボット業界最大手と評されるボストン・ダイナミクスは、軍事運用を禁じる厳格なルールを設けていますが、当然ながら全てのメーカーがこうしたルールを設けているわけではありません。The Vergeは多くの団体が求めているにもかかわらず(PDFファイル)アメリカの公式政策が自律型致死兵器システムに関する開発や販売を禁止していない点を指摘し、来るべき時が来た
こわい
簡単になっていた件というタイトルだが、いろいろインストールする必要があり、そこまで簡単ではない様子だった。
そのくせ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 = ...)
NBIDIA RAPIDSのXGBoostもたしかGPUを効かせられたような気がする。どっちの方が簡単なんだろう。
育児系情報コミニュティサービスにおける、質問記事のレコメンデーションをどのように実装していったかの変遷とそれをどのように提供しているかの紹介。
今回は変遷の方が面白いのでそちらだけ要約。
このアプローチではベースラインの精度を超えられず、導入は至らなかったとのこと。
原因としては、質問カテゴリが不均衡になっていたことで、特定のジャンルの質問ばかりが優先的に推薦されていたからとのこと。
同じカテゴリでも、趣向が違う質問が結構多かったため、トピックモデルによる推薦を試した。
記事集合に対してgensimでトピックモデルを学習し、そこからユーザーの興味ベクトルを算出することで推薦を行う。
このアプローチはベースラインと同等の性能を出すことができたのだが、ユーザーのベクトルを作るのが計算量的に高くつくだったり、質問の多様性が高くないという問題があったとのこと。
お馴染みのやつ。
ただ、質問ベクトルの作り方が面白かった。 質問IDのの閲覧系列からベクトル作ることで、結構いい感じのベクトルが作れたらしい。
このアプローチではベースラインの精度を還元にout performすることができ見事運用に乗ったとのこと。
普通はWord2VecとかBERTとかに突っ込みそうなところを、質問IDの系列でいい感じの質問ベクトルが作れるのは面白い。
Vertex Pipelinesの基本的な使い方と前処理→モデル学習→後処理のサンプルパイプラインを作るためのコードが紹介されている。
今すぐ必要というわけではないが年のためメモ。
FastAPIで立てたAPIのパフォーマンスを100rpsを目標にチューニングし、結果250rpsまで向上させた事例の紹介。
Locustで負荷をかけ、DataDogでシステム全体のパフォーマンスを測定し、fastapi_profilerとpy-spyでアプリの性能を計測する。
ただし、DataDog APMは機能が充実しているもの高かったり、fastapi_profilerはプロファイイングをすることによる性能劣化が無視できないとのこと。
一方でpy-spyはrustで書かれている低オーバヘッドなプロファイラーで、api以外のスレッドについても計測してくれるので便利とのこと。
アプリの構成
遭遇した課題
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
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で推論することができる。
webブラウザで処理が簡潔できるようになると情報セキュリティが厳しい案件の時は良いかも。
TLDR: Extreme Summarization of Scientific Documentsという論文の著者実装。
このレポジトリでは3,200の科学論文とそれに対応した5.400の要約のデータが付属している。
このデータ自体はOpenReviewの著者要約とレビュアーコメントをアノテーターが要約した文が正解となっていて、学習を高速化させるために、タイトル生成をmulti task的にとかしている。
デモページで動作を確認しようと思ったら動かなかった。。。 著者要約をそのまま使わないで、レビュワーコメントも用いているので高品質な要約生成が期待できそう。
自己教師あり学習を医療ドメインに適用し、教師あり学習よりも好成績を収めたという報告。
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.
その結果がこちら。教師あり学習よりも最終性能が高く、必要なラベル数も少なく済む。
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時間というのはたまげたなぁ。
ライブラリのインポートから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は結構忘れやすいので、気をつけないといけない。
詳しくはこの記事を参照
pytestとvscode拡張のpython, pytest-covを入れることで、vscode上でテストの実行と、テストされたコードの可視化を行うことができる。
便利そうなのでメモ
訓練データセットに対して過学習している状態がしばらく続いた後に、突然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
実験に用いたデータセットは数独パズル的な論理演算データ。
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.
weight decayは大事なんだな。 実際に学習を行うときは訓練誤差が張り付いててもしばらくは粘る必要があるのだろうか
AWS Transit Gatewayを用いて、以下を同時に達成することで、スピーディに商用提供用の環境構築を可能にした事例の紹介。
- 顧客毎に利用するAWSアカウントをわけ、顧客データにアクセスできるメンバーをプロジェクトメンバーに限定する
- 一方で認証や監視等の共通基盤はまとめる
AWS Transit Gatewayは、AWSアカウントをまたぐネットワーク(VPC)やオンプレミスを含めた異なるネットワークを一つの中央ハブで接続して通信、通信制御出来る仕組みです。特徴として以下の項目が挙げられます。
- VPC間接続を簡単に管理するためのシンプルなリージョナルゲートウェイ
- 数千のVPC, VPN, DirectConnectを接続可能
- アタッチメントごとのルーティングを可能にするルーティングドメインのサポート
hared serviceで基本的な認証や利用ログ等を含む共通的なFront画面とAPIを提供しており、shared serviceからアルゴリズムリポジトリテーブルを参照してアルゴリズムのendpointを特定しTransit Gatewayを経由してアルゴリズム推論を実行します。
推論だけではなくて何らかの個別のドメインデータを持ってサービスを提供する場合はオーソドックスに顧客アカウントでサービスを構築します。この場合はshared serviceの認証や利用ログ等マイクロサービスで提供される機能を必要に応じて利用できます
認証認可や利用状況のモニタリングなどの要素をPRJ/顧客環境ごとに作るのは確かに非効率的なので、
そこを共通化しつつ、分けなければいけないところは分けて、AWS TGW繋いでしまうというのは確かに良いアプローチに思える。
BERTを用いた教師なし文表現
BERTを用いた教師なし文表現ベクトルの獲得方法を提案した論文。 教師あり文ベクトルの獲得手法と同等程度の性能が出るらしい
背景
手法
手法はシンプルで、同じ文を異なるdropout maskのBERTに入れたものを正例、異なる文をBERTに入れたものは負例となるように対比学習を行う。
結果
文類似度タスクでの実験結果。
素のBERTはgloveに負けているが、提案手法は+10% ~ +20%性能が改善されている。
考察
l_alignは高いほど文類似度タスクの性能が上がり、l_uniformが高いほど分布が一様に広がっていることを示すもの。
素のBERTはl_alignが高いががl_uniformが低い。提案手法はバランスが良いことがわかる。
日本語データによる追試
NLIタスクに関してはSimCSEによる精度向上が確認された。
クラスタリングに関しては素のBERTの方が良いという結果だった。
コメント
dropoutかけるだけでcontrastive learningが成立するのだろうか...。
とくにaugmentationとかもいらないのか。 とはいえこれが成立するということは、Multi Sample DropoutやR-Dropが効くという裏付けにもなるのかな。
出典
元記事
元論文