Open GENZITSU opened 3 years ago
albumentationsの変換をtensorflowでも使えるようにするライブラリ
ImageDataAugmentor is a custom image data generator for tensorflow.keras that supports albumentations.
以下のようにalbumentaionsで定義した変換をImageDataAugmentorに渡すことで、使えるようにする
# from
AUGMENTATIONS = albumentations.Compose([
albumentations.Transpose(p=0.5),
albumentations.Flip(p=0.5),
albumentations.OneOf([
albumentations.RandomBrightnessContrast(brightness_limit=0.3, contrast_limit=0.3),
albumentations.RandomBrightnessContrast(brightness_limit=0.1, contrast_limit=0.1)
],p=1),
albumentations.GaussianBlur(p=0.05),
albumentations.HueSaturationValue(p=0.5),
albumentations.RGBShift(p=0.5),
])
# dataloaders
train_datagen = ImageDataAugmentor(
rescale=1./255,
augment=AUGMENTATIONS,
preprocess_input=None)
model.fit(
train_generator,
使い慣れているalbumentationが簡単にtfで使えるようになるのはありがたい。
仮説検証を効果的に行えるようになるためのエッセンスをまとめたスライド。
検証しやすが大事
人がいない, 予算が足りないなどの言葉は安直な解決策に陥りがち。
それらの多くは解決策ではなく、事実を言い換えただけに過ぎない。
安易にないない言葉をつかうのではなく、まずは正確に現状を観察することが大事
安易にOOがないと言いがちになりそうなので、気をつけていきたいところ。
アノテーションデータを既存辞書から自動生成して、キーワード抽出を行う試みの紹介
辞書を用いないキーワード抽出器は、専門性が高すぎる単語や社内用語をカバーできる可能性があり魅力的だが、アノテーションコストが甚大。 そもそもキーワードのアノテーションが難しいのもつらい
ということで、既存の辞書から教師データを作成して、キーワードを予測するモデルの作成を行った。
使用モデルは今後英語にも拡張したいため、bert-base-multilingual-cased。
以下が学習データ
言語: すべて日本語
文数: 6437 文
平均文字数: 64.4 文字
平均キーワード数: 4.1 個
ユニークキーワード数: 7870 語
既存辞書の出力は全て網羅しつつ、それっぽいキーワードも拾えるようになっている。
一方で、元々の辞書にあまり入れてこなかった人名や社名などは当然ながら取りづらくなっていた。
面白いのは日本語データでしか学習していないのに、英語データでもある程度機能すること
トークンの並び方からちゃんと予測できているということだろうか
8000単語ほどの辞書で、そこそこやれてるのはすごい。
学習させたモデルの結果をもとに、辞書への追加を行っていけば辞書の拡充も楽になりそう。
(pseudo labelingとかもありかも?)
一方で、人名、社名についてはそもそもキーワードか?という話がでてくる。
キーワード自体も流行のキーワードと普遍的なキーワードあると思うが、人名・社名は前者に相当しそう。
となればコンテンツ管理者(?)が週次で足し引きしたり、単語出現頻度の推移とかで管理した方が良さげな気もする...。
動画配信中にプライベートな通知が来たときに、内容をぼかす機能を作成するまでの道のり。
めちゃくちゃ高速に動作することが必要だが、実現させるところまで行ってるのがすごい。
難しい内容も多いので、大事そうなところだけかいつまむ。
image/color や image/draw を使うことで非常にシンプルに変換できるため使いたかったのですが 360p の1フレームあたりの処理時間です、RGBA -> YCbCr に 3.914ms / YCbCr -> RGBA に 0.976ms 合わせて 4.89ms ほどかかり
for文のunrollなどを用いた画そこまで早くならず、libyuv による実装でめちゃくちゃ早くなった。
libyuv にしたことにより RGBA -> YCbCr が 0.075ms (Go版は 3.914ms) / YCbCr -> RGBA が 0.125ms (Go版は 0.976ms) となりかなり処理速度が向上しました
情報量が少ない領域は popcount = 0 とみなすことができるため、情報がある領域だけ計算を行うようにできます
ここまでで、 Pure Go だけで実装していた場合だと(正確なログが残っていないのでざっくりになりますが)10-15fps程度(100ms+)だったものが 30fps(30ms以下)程度にはなりました
- 最初に手掛けたのはSIMDで処理できるところを置き換えていくことでした
- cgo 経由のオーバヘッドも気になってきました さて、SIMD処理への置き換えやその他ロジックの最適化等を行った結果、 300fps(3ms+) くらいまで下げることができました
halide は C++ の DSL言語として利用できる、プログラミング言語です 大きな特徴はアルゴリズムとスケジューリングの分離が行える言語であることと、CPU/GPUなどに最適化されたコードを出力してくれる点
halide によって既存ロジックを置き換えることなく、スケジューリングによってチューニングができるようになったのはとても大きく、また チューニングを加えることがなくてもそこそこの良い速度で処理できるのも良いです
その後、 libyuv や SIMD などの処理をすべて halide に置き換えを行いました
この時点で、0.7ms 程度でfpsにすると1400fpsくらいでしょうか、(もろもろ荒削りですが)検出からぼかし処理までを行えるようになっていました
縁遠い世界の話だが、高fpsを求める際にはこういう技があることを頭に入れておきたい。
google aiからiclr 2021で発表された異常検知手法のスライド 自己教師あり学習学習 + one class classifier (oc-svm, kde)などで異常検知を行う。
ちなみに、Distribution augmented contrastive representationというのは、下記のようなもので、 異なるインスタンス同士 + 同じインスタンスでも異なるaugmentationだったら離すことをゆうらしい。
そのほか実践的な検証もされており、
表現学習のアンサンブル
SSLに必要なデータ数と正解率
ミスラベルの混入による精度悪化
DA contrastive representationの効能はこちらの表でも確認できる
~100枚くらいだとpretrained modelをつかったほうがよいが、250枚を超えるとsslで表現を学習したほうが精度高いのが面白い。 実務では対抗クラスをもってこれるので、one classのみで学習させるケースはあまりなさそうだが、学習データからの逸脱度合いをはかるのにはつかえるかもしれない。
有害なソフトウェアを画像化して検出しようという論文が2つ紹介されている。
マルウェア検出ではパターンマッチングベースの手法が元々用いられていたが、攻撃側はさまざまな手を使ってパタンマッチングを逃れる。これの対応としてsandbox環境などで動的な検知などを行うことも可能だが検知が遅く環境構築の必要性がある。
A Novel Malware Detection System Based On Machine Learning and Binary Visualizationという論文ではバイナリやASCIIのコードを画像化してマルウェアの検出を行う方法を提案している。
この論文では、悪意のあるファイルはさまざまなASCIIコードが用いられておりカラフルな画像になるとのこと。
Malicious files have a tendency for often including ASCII characters of various categories, presenting a colorful image, while benign files have a cleaner picture and distribution of values.
画像化の方法は以下のようにしている。
The dataset contained a variety of malicious payloads (viruses, worms, trojans, rootkits, etc.) and file types (.exe, .doc, .pdf, .txt, etc.).
結果としては ランサムウェアによく用いられる .docや.pdf形式のファイルに対する検知性能が良く、正解率としては74%だったとのこと。 (論文の数値を見てみると)
Experiments by the researchers showed that the deep learning model was especially good at detecting malware in .doc and .pdf files, which are the preferred medium for ransomware attacks. The researchers suggested that the model’s performance can be improved if it is adjusted to take the filetype as one of its learning dimensions. Overall, the algorithm achieved an average detection rate of around 74 percent.
フィッシング攻撃に対する典型的な防衛策はブラックリストとホワイトリスト方式であるが、ブラックリスト形式は実際に被害が起きてから出ないと対応できず、ホワイトリスト形式はメンテナンスが大変という問題がある。
A Novel Approach to Detect Phishing Attacks using Binary Visualisation and Machine Learning という論文ではサイトのhtmlやcssを画像化することで、フィッシングサイトの検出を試みている。
画像化したサイトをCNNで判別させており、正解率は94%だったとのこと。
The researchers’ experiments showed that the technique could detect phishing websites with 94 percent accuracy.
画像への変換方法は以下、一個上の論文と共通の著者がいるから似たような方法をとっている。
音を画像化して~とか、重力波を画像化して〜などと同じ文脈で、サイトやプログラムを画像化して〜みたいなのができることに驚いた。
Pythonと似た書き方でデータ分析ができる言語としてNimが紹介されている。
NimはPythonと同じように書きやすく、Cと同じくらい早い。
t a high level, Nim is as easy to write as Python and as fast as C. It's part of a newer generation of languages that have the performance of compiled languages with the expressiveness of dynamic languages. If you know Python, you're 90% of the way to knowing Nim and reaping all of the benefits.
Nimはコンパイル言語であるがコンパイルが早いらしい
Even though Nim is a compiled language, the compilation process is fast enough that it can be used in place of an interpreted one.
pythonとnimの比較
環境構築の方法とかきになる。色々ライブラリが整ってくるといいなぁ。
torchvisionで学習済みモデルとして提供されているobject detectionモデルのベンチマーク。
やはりlatencyが低いのはSSDやmobilenet v3みたいだ。
ベンチマークされてるモデル自体はそこまで多くないが、latencyまで乗せてくれているのは実務的には助かる。
機械学習モデルを別のモデルで説明するやり方のハンズオン。
XAIライブラリを使わずに自分で摂動を与え説明モデルを作成しているのが珍しい。
代理モデルを立てる際の注意点や、摂動に関する注意点も書かれておりとても良い。
さて,ここからが本題です.データを準備して摂動を加えて新しいデータを作ります.この摂動はカテゴリカルなデータにも使える・欠損を生じさせない,実装が楽などの特徴があって使いやすいため,わたしは好んで使っています.特徴量間に強い相関がある場合にはナンセンスな設定になることに注意してください.
決定木がどのパスを通ったかを表示できるのもしらなかった。
https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html
初めて勉強するのにとても良いハンズオンだとおもいます。
写真をドット絵に変換するライブラリで、オリジナルのPyxelateよりも高速に動くように実装されている。
おおまかな使い方は下記のようになっており、sklearnライクな使い方ができるようにデザインされている。
# from https://github.com/sedthh/pyxelate
from skimage import io
from pyxelate import Pyx, Pal
# load image with 'skimage.io.imread()'
image = io.imread("examples/blazkowicz.jpg")
downsample_by = 14 # new image will be 1/14th of the original in size
palette = 7 # find 7 colors
# 1) Instantiate Pyx transformer
pyx = Pyx(factor=downsample_by, palette=palette)
# 2) fit an image, allow Pyxelate to learn the color palette
pyx.fit(image)
# 3) transform image to pixel art using the learned color palette
new_image = pyx.transform(image)
# save new image with 'skimage.io.imsave()'
io.imsave("pixel.png", new_image)
よく用いられるようなプリセットカラーパレットも存在している。
おそらくゲームやアートなどへの使用が想定されていると思うが、
実際にノベルゲームのdot絵にする過程はこちらのqiitaが詳しい
https://qiita.com/komanaki/items/237161a43285471ad3c9
githubのreadmeを見る限りではかなりうまくいっているが、qiita記事をみてみると変換後に手修正が必要なようだ。
ドット絵にする前にしておくべき前処理的なものがあるのかもしれない。
AWS Glue と AWS Lambdaの比較記事。
結論としては、ETL系の処理は基本的にGlueに任せ、簡単な物についてはLambdaを使用するのがよいとのこと。
以下理由
どうでもよいけど、説明で出てくる図がかわいい。
GoogleがGCPのレべニューシェアを3%へ大幅引き下げする可能性が出てきている。
Google Cloud Platformについて新たに、CNBCが匿名の情報筋からの情報として「Googleがレベニューシェアを20%から3%に引き下げる予定がある」と報じました。CNBCはGoogleにレベニューシェアを引き下げる予定があるのか直接問い合わせており、同社の広報担当者は「マーケットプレイスの料金体系の改定が進行中であることは事実です。これについては、近日中に詳細をお知らせします」とコメントしています。
これの動きには、プラットフォームの独占力を下げるような圧力が強まっている背景がある。
Googleがこのような動きを見せているのは、ビッグ・テックに対して「プラットフォームの利用手数料を引き下げろ」と多方面から圧力がかかっているため。Googleはアメリカの36州とワシントンD.C.から「Google Playは手数料を取り過ぎている」と訴えられているだけでなく、Appleも公式アプリストアの手数料を回避する手法を規約で禁じる行為を巡る裁判で敗訴。世界的IT企業の運営するプラットフォームの利用手数料を巡って複数の大型訴訟が進行しているだけでなく、世界各国が法規制を検討している段階です。
これに際して、app store系の手数料も近年大幅に下がっており、ある会社の値下げに追随して他社も値下げが行われた経緯がある。
Appleは2020年11月にApp Storeの配信手数料を30%から15%に引き下げると発表し、この発表を追う形でGoogleも2021年3月にGoogle Playの手数料を30%から15%にすると発表。Microsoftも2021年4月にMicrosoft Storeで販売されるPCゲームの販売手数料を30%から12%に引き下げると発表しています。
この議論に関しては以下のよう記事もある
長年30%だったGoogle Playの配信手数料の損益分岐点はわずか6%、30%という数値も「Appleの丸パクリ」と裁判で報告される
この動きが実際に行われるとAWS, Azureとかも料金引き下げされることになるんだろうか。
Pytorchで書かれたMLPをJAXに書き換えるという記事。
jaxではflax.linenでモデルを書くことができる
# from https://zenn.dev/jellied_unagi/articles/d986044a425e94
import jax import jax.numpy as jnp import flax.linen as fnn
class MLP(fnn.Module): @fnn.compact def call(self, x): x = fnn.Dense(128)(x) x = fnn.relu(x) x = fnn.Dense(256)(x) x = fnn.relu(x) x = fnn.Dense(10)(x) x = fnn.log_softmax(x) return x
またパラメータも後付けで設定する形になる。
- numpy系の関数はjax.numpyに色々実装されている (jnpでimportされている)
model = MLP() params = model.init(jax.random.PRNGKey(0), jnp.ones([1, 28 * 28]))['params']
これを学習ループにすると以下
- jax.value_and_gradを用いてgradientとlossを計算することが可能
- jax.jitでコンパイルしているところもポイント
@partial(jax.jit, static_argnums=(3,)) def step(x, y, state, is_train=True): def loss_fn(params): y_pred = state.apply_fn({'params': params}, x) loss = optax.softmax_cross_entropy(logits=y_pred, labels=y).mean() return loss, y_pred x = x.reshape(-1, 28 * 28) y = jnp.eye(10)[y] # optax.softmax_cross_entropyはone-hotを受け取る if is_train: grad_fn = jax.value_and_grad(loss_fn, has_aux=True) (loss, y_pred), grads = grad_fn(state.params) state = state.apply_gradients(grads=grads) else: loss, y_pred = loss_fn(state.params) return loss, y_pred, state
### 結果
pytorchにtf datasetsを使うのでもかなり高速化されているが、JAXをいれるとさらに20%ほど高速化している。
<img width="400" alt="スクリーンショット 2021-09-27 20 31 08" src="https://user-images.githubusercontent.com/19774756/134900145-8c93bce9-d12c-4c16-a9a2-5ea876e5e517.png">
### コメント
あれ思ったよりも高速化していないな...?
しかしtf datasetsのプリフェッチ機能はやはり強力でモデル部分はpytorchを使いつつも、dataloaderはこっちをつあくべきかもしれない。
参考として[これのqiita](https://qiita.com/namahoge/items/71be06c8fe37e88909c9)がある
### 出典
[元記事](https://zenn.dev/jellied_unagi/articles/d986044a425e94)
jaxとpytorchを比較していきましょうというgithub 現状はMLP on MNIST / CNN on CIFAR10/ VAE on MNISTが作成されている。
ちなみにCNN on CIFAR10ではjaxの方が1.3倍ほど早い。 pytorch:
jax:
MLP on MNISTでも1.3倍程度 ptorch:
jax:
VAE on MNISTでは2.3倍程度 pytorch:
jax:
jaxのコードサンプルとしても有用。
所詮線形倍程度だからあれかもしれないだけど、我々はMLフレームワークの移行期に差し掛かっているのかもしれない。
pytorchの訓練コードを様々なデバイスで学習させられるようにするライブラリAccelerateの紹介
以下のコードのように.to(device)の代わりに、accelerator.prepare
を用いてデバイスの設定などを行う。
AMPによる訓練やgradient clippingなどもで設定可能
accelerator = Accelerator(fp16=True)
accelerator.clip_grad_norm_(model.parameters(), max_norm=5, norm_type=2)
ただし実際使う時は以下のようにaccelerate configのコマンドを実行してからlaungをする必要がある。
# from https://zenn.dev/hiroya_w/articles/c13f2153fe8bd16dd947
# ノード数やGPU数,FP16を使うかどうかの質問に答える.
$ accelerate config
# その後
$ accelerate launch path_to_script.py --args_for_the_script
これをnotebookでやるための関数も用意されている
from accelerate import notebook_launcher
notebook_launcher(training_function)
これcolabのTPUでも学習できるようになるんだろうか?後で試したい。
APIキーなどの環境変数を.envなどに入れる際に便利なライブラリpython-dotenv
の紹介
.envファイルで管理すると呼び出しの際に都度、source .envなどをしないといけなくなるが、 python-dotenvは以下のようにすることで、それを不要にする。
https://towardsdatascience.com/stop-hardcoding-sensitive-data-in-your-python-applications-86eb2a96bec3
import os
from dotenv import load_dotenv
# load_dotenv will look for a .env file and if it finds one
# it will load the environment variables from it
load_dotenv()
PROJECT_ID = os.getenv("PROJECT_ID")
API_KEY = os.getenv("API_KEY")
STORAGE_BUCKET= os.getenv("STORAGE_BUCKET")
もちろんカレントディレクトリに.envファイルがある必要がある。
その他の使い方として、以下も公式のgithubで紹介されていた。
環境変数ではなく辞書オブジェクトとして用いる
from dotenv import dotenv_values
config = dotenv_values(".env") # config = {"USER": "foo", "EMAIL": "foo@example.org"}
.envファイル以外のものを使用する
import os
from dotenv import dotenv_values
config = {
**dotenv_values(".env.shared"), # load shared development variables
**dotenv_values(".env.secret"), # load sensitive variables
**os.environ, # override loaded values with environment variables
}
IPython notebookで使用する
%load_ext dotenv
%dotenv
or
%dotenv relative/or/absolute/path/to/.env
requirements.txtは増えるけど、毎回sourceするのも手間だからこれもいいなぁ。
商用とかであればsource コマンドと併記する形にして、開発期間は何回も打つからこっち使いたいところ。
何か脆弱性とかないんだろうか?
Questgenとは元となる文章を与えることで自動で質問文を生成することができるライブラリ
生成できる質問の種類は以下の6種
①boolean (Yes/No) Questions:真偽問題の生成 ②MCQ Questions:多選択肢問題の生成 ③FAQ Questions:質問・回答ペアの生成 ④Paraphrasing Questions:言い換え文の生成 ⑤question Answering (Simple):質問回答 ⑥question Answering (Boolean):質問回答(真偽)
使用しているモデルはT5のようだ。
For maintaining meaningfulness in Questions, Questgen uses Three T5 models. One for Boolean Question generation, one for MCQs, FAQs, Paraphrasing and one for answer generation.
Questgen自体は英語にしか対応していないがこの記事では、DeepLの開発者向けAPIを用いて日本語の質問文の作成をしている。
Questgenの呼び出し方はかなり簡単
qe= main.BoolQGen()
en_text = deepL_trans_to_en(ja_text) # 日本語を英語に変換
payload = {
"input_text": en_text
}
output = qe.predict_boolq(payload) # 質問生成
以下のような質問文の生成が可能
【入力文】
久保は9月22日に行われたレアル・マドリード戦に出場。5試合連続のスタメン入りとなったが、
前半のみの出場に終わっていた。海外メディアは、松葉杖をつく久保の姿を報じていた。日本代
表戦も控える中、心配していたことが現実になってしまった。
【問題1】
久保は松葉杖をついたことがありますか?
【問題2】
日本のスター、久保は松葉杖をついていた?
【問題3】
日本で松葉杖を使ったことがある人はいますか?
入力: フォーブスが発表した最新の「世界で最も稼ぐサッカー選手」ランキングで、
今回もトップを堅持したのは、前回のリストから順位を入れ替えた1位のクリ
スティアーノ・ロナウドと、2位のリオネル・メッシだった。
問題1 : クリスティアーノ・ロナウドを最も稼いだサッカー選手に選んだのは?
選択肢1 : フォーブス
選択肢2 : Business Insider
選択肢3 : Wsj
選択肢4 : Nyt
問題2 : 世界で最も稼いでいるサッカー選手は誰ですか?
選択肢1 : ロナウド
選択肢2 : クリスティアーノ・ロナウド
選択肢3 : リオネル・メッシ
選択肢4 : ウェイン・ルーニー
問題3 : No.1のサッカー選手は誰?
選択肢1 : リオネル・メッシ
選択肢2 : ティエリー・アンリ
選択肢3 : ウェイン・ルーニー
選択肢4 : Cristiano Ronaldo
問題4 : トップの座は何ですか?
選択肢1 : スポット
選択肢2 : で
選択肢3 : 次のページ
入力: むかしむかし、あるところに、おじいさんとおばあさんが住んでいました。おじいさんは山へしばかりに、
おばあさんは川へせんたくに行きました。
問題1 : 川に行って洗ったのは誰?
選択肢1 : ママ
選択肢2 : おばあちゃん
選択肢3 : 祖母
選択肢4 : 大叔母
問題2 : おじいさんはどこに行って調達してきたの?
選択肢1 : 湖
選択肢2 : 砂丘
選択肢3 : 山
選択肢4 : キャニオン
問題3 : おばあさんはどこで服を洗ったの?
選択肢1 : 川
選択肢2 : 湖
選択肢3 : ショアライン
選択肢4 : クリーク
入力: 龍心は那須川天心の弟で、現在中学3年生。天心同様幼少の頃から空手を始め、数々のアマチュア大会で結果を残している。対する山﨑は、関西のアマチュア大会『TOP☆RUN』の2階級王者。 試合は12オンスグローブで、ヒザとスネあてを着用、
ヘッドギアは無し。顔面へのヒザ蹴りは禁止で、ワンキャッチワンアタックルールとなる。
-質問1-
龍心の現在の学年は?
-質問2-
龍心の兄は誰?
-質問3-
試合のルールは?
-答え1-
現在、中学3年生のRyushin。
-答え2-
那須川天心
-答え3-
ゲームのルールは、12オンスのグローブ、ニーパッドとシンパッドを着用し、ヘッドギアは着用しない。
このクオリティは凄すぎる。。 T5を使っているということなので、実行時間は相応に長いことが予想される。
CNBCによれば、同社は、Google Cloud Marketplaceのアプリストアの売り上げから徴収する手数料を20%から3%に引き下げるという。GoogleのMarketplaceは、企業がSaaSアプリケーションを顧客に流通させるためのプラットフォームだ。
AWS: 32%, Azure: 19%, GCP: 7%というシェアのようです。
AWSは依然として市場シェアの32%を占めており、Microsoft Azureがシェア19%、Google Cloudがシェア7%でAWSの後を追う形になっている。Googleは機械学習、アナリティクス、データ管理に力を入れている。
なるほどGCPのクラウド費用ではなく、アプリストアというものがあってそこの手数料だったんだな...
GMOペパボのエンジニア研修2021の資料を公開します
内容は、Ruby on Rails, コンテナ(Docker, terraformなど), Web セキュリティ, フロントエンド, モバイルアプリ, 機械学習
コメント
個人的にはコンテナとWebセキュリティのところがきになる。
出典
元記事