Open GENZITSU opened 2 years ago
TensorflowとPytorchの対応関係が見やすく/わかりやすくまとめられている。 さすがrishigami...
ほぼ全ての資料を抜粋したいところだが、特に有用だったやつだけまとめておく。
マジモンっすね。
tfの方が学習が早いみたいなところあるので、使い所ありそうっていうのと、
timmのtf版とか作るのに結構良さげ。
timmの基本的な使い方に加えて、ちょっと複雑なことをやる方法が紹介されていた。
headの無効化やpoolingの無効化をすることができる
自分でモデルを組む際は、featureの情報を参照するのが良さそう。
RGB画像ではないものについても適用可能で、in_chansを指定することでよしなにやってくれる。
featuremapを取り出したり、poolingの仕方を変化させることも可能。
timmをencoderとして物体検出やsegmentaionモデルをカスタムで作成する際に便利そう。
各部署に我流・亜流のプロセスでモデルを構築・デプロイすることを許してしまう 部署のプロジェクトオーナーやデータサイエンティスト独自の判断だけで自由に構築されたモデル(シャドー AI)がビジネスに適用される状況となり、企業として AI 運用のリスクを管理できる状態ではなくなります。
複数のモデルがデプロイされるようになると、モデルのバージョニングや、一定の水準を満たした予測精度の監視が極めて困難になります モデル構築環境が異なり、モデルのバージョニングやモデルの管理がバラバラになってしまう 統合的な監視環境が準備できていない企業では、予測精度をそもそも監視することができない
モデルのリリースは、ピークタイムが発生します。 一方で、運用担当者のリソースは簡単にスケールすることはできないため柔軟性が確保できない 現実解としてピーク時に対応可能な最小リソースで体制を構築する選択を採る企業が多い こうした状況は品質の低下、ガバナンスの崩壊、人材の離職などのリスクを増大させます。
定められたプロセスに則りデプロイされる仕組みを構築する 「いつ、誰が、どのような観点でモデルとそのリスクを評価し、デプロイを判断するのか」というように、役割と責任の定義が明確化されていることが前提 インセンティブの異なるプロジェクトオーナー、プロジェクトマネージャー、データサイエンティスト(DS)、AI エンジニアが相互にチェックし合うプロセスを構築し、自社として標準化することができれば信頼性を十分に担保することができる
モデル構築に使われた開発環境を問わずに一元的にモデルを管理できる仕組みの構築と、運用中のモデルの精度をリアルタイムで統合的に監視しドリフト検知するためのインターフェースや機能を準備しなければなりません。
生産性を向上させる鍵となるのは、タスクの自動化とその範囲の拡大 自動化は同時に属人化の排除にもつながり、離職リスクを抑制し、事業継続性を高める AI モデル構築の自動化には AutoML ツールの活用を検討する必要があり、デプロイの自動化には CI/CD といったパイプライン構築が必要
承認フローに関してはあまり同意できないものの、どういう基準であればデプロイする/しないはプロダクト側としっかり握る必要がありそうだ。
群衆の数え上げ問題に対する、代表的な3手法がまとめられている。
occulusion問題
相互に occulusion が発生するので、それを考慮した上でモデルを学習する必要がある 従来は、バウンディングボックスを与えて、それを元にモデルを学習していましたが、この方法では occulusion の問題に対処しにくいため、現在では点によるアノテーションのデータを用いることが多い
遠近効果
同じ対象物を扱う場合でも、手前に写っている物体は大きく見え、奥に写っている物体は小さく見えることをうまくモデルに落とし込む必要がある
detection-then-count
バウンディングボックスによるアノテーションが必須となります。 アノテーションが非常に大変であるという課題がつきまといます。 基本的にまず物体検知を行うため計算量が大きく、occulusion の問題に弱い そのため、対象物が比較的少ない場合にはうまくいく手法
direct count regression
直接対象物の数を回帰 するアプローチ 点によるアノテーションを用いたり、場合によっては明示的にそうしたアノテーションを利用しなかったりするので、アノテーションコストは detection-then-count の場合よりは抑えられる
density map estimation
現時点で一番性能が高いとされており主流のアプローチ 点によるアノテーションデータを利用
density map estimationが終わった後は、最終的に点(頂点?)の数を数えることになるのだろうか。
occulusion問題は点アノテーションで回避できるものの、occulusionしてるところの点とそうでない点も平等に扱うことになるのだろうか...?
pytorchの学習ループ中でtqdmを用いる方法の紹介
要点としては
tqdmのバージョンによって動かなくなること
tqdmのバージョンを4.38.0?では、 学習の途中で無限ループのような感じになった。 なので、tqdmのバージョンを上げて、4.43.0で実行すると、 きちんと動くようになった。
tqdmの引数にはエポック数や、分母の単位を設定して、set_postfixにみたい値を設定すれば良い模様。
引数のtotalに繰り返しの合計数などを入れ、繰り返し時にupdate(n)でバーをnだけ進めて行く。 引数のunitは入れた文字で処理速度の単位を変えることができる。 set_description(f"Epoch{epoch}/{num_epochs}")で、 バーの前側の部分に現在のepoch数と最終のepoch数、 trainかtestかを表示 set_postfix({"loss":running_loss.item(),"accuracy":accuracy })でバッチごとに学習またはテストした途中の段階でのlossと精度accuracyを更新
サンプルコード
# from https://www.msdd.info/entry/2020/03/26/190000
with tqdm(total=len(dataloader[phase]),unit="batch") as pbar:
pbar.set_description(f"Epoch[{epoch}/{num_epochs}]({phase})")
for imgs,labels in dataloader[phase]:
imgs,labels=imgs.to(device),labels.to(device)
output=model(imgs)
loss=criterion(output,labels)
if phase=="train":
optimizer.zero_grad()
loss.backward()
optimizer.step()
predicted=torch.argmax(output,dim=1) ## dimあってる?
corrects+=(predicted==labels).sum()
total+=imgs.size(0)
#loss関数で通してでてきたlossはCrossEntropyLossのreduction="mean"なので平均
#batch sizeをかけることで、batch全体での合計を今までのloss_sumに足し合わせる
loss_sum+=loss*imgs.size(0)
accuracy=corrects.item()/total
running_loss=loss_sum/total
pbar.set_postfix({"loss":running_loss.item(),"accuracy":accuracy })
pbar.update(1)
自分で生のtraining loopを書く際に便利そう。
メトリクス監視用のライブラリとか使うことも可能だけどね
Optical Adversarial Attack Can Change the Meaning of Road Signsという論文の紹介記事
いわく、
パデュー大学のAbhiram Gnanasambandam氏らは衣類やバスケットボールのように凹凸のある物体や道路標識のように平らな物体に対し、ノイズの混ざった光線を照射して機械学習システムがどう認識するかを確かめる実験を実施
「STOP」と表示された一時停止標識にOPADを行うことで、システムに「Speed 30」という制限速度標識であると認識させることにも成功
![]()
100%成功するわけではない上に、光量が増えると攻撃成功率が下がるとのこと
Gnanasambandam氏らの実験では、64回行ったOPADのうち、31回でシステムを誤認させることに成功 Gnanasambandam氏らは「凹凸のある物体でOPADを成功させるのは難しいですが、平らな面のある物体はOPADにとって理想的です」と述べました。 ISO感度を上げて光量を増やすとシステムの認識精度も上がったことから、OPADは周囲が暗い夜間にのみ機能する可能性がある
一応、学習済みモデルにアクセスできる場合とできない場合を試しており、両方成功しているようだ。
今回の実験では、攻撃者がシステムの学習モデルにアクセスできた場合と、アクセスできずに自身で学習を行った場合を想定して行い、両方で成功した
光線で誤認識させられるのは実用性?高そう。
どこから照射したのかにもよるけど、普通に過ごしてたら気づかないだろうし。
現状、昼間での攻撃性能は低いものの、しばらくすれば昼でも動くものができそうだし...
これまでのAIのやらかし事例が収集されているサイト。
最近の事例だと10代の黒人がブラックリストの別人と顔認識システムに間違われ、スケートリンクに入れなかった事例が報告されていた。
結構いろんな事例が見つかるので、面白い。
反面教師としていきたい。
教師無しでDNNへの異常な入力を検知するフレームワークの提案。
基本的にどのようなNNでも用いることがメタなアルゴリズム。 layer毎にクラスに基づく条件付き統計量を求める。
こちらが提案手法 層毎に条件付き統計量を算出して、p値を計算していく感じ
教師無しで使えるのは良さそう。
クラスの条件付き統計量となると、segmnetaion系はどうなるんだろうか
poetry + pytest + formatter + mypy + github actionsをふんだんに盛り込んだ開発方針の紹介
poertyでは開発用と配布用のパッケージを分けて管理することが可能
poetryのテストではではカバレッジが出せるっぽい
formatter関連
github actions
github actionsで全部formatter, testやらせるのよいな...
真似できるところから真似していきたい。
コードフォーマット機能が勉強になった
コードフォーマッターのBlackと、BlackをJupyterLabから利用するためのJupyterLab Code Formatterを導入します。
# from https://dev.infohub.cc/setup-jupyterlab-v200/
pip install black
# JupyterLab Code Formatterの導入
pip install jupyterlab_code_formatter
# JupyterLab Code Formatterのインストール
# 事前にNode.jsの導入が必要
jupyter labextension install @ryantam626/jupyterlab_code_formatter
jupyter serverextension enable --py jupyterlab_code_formatter
この後black用のキャッシュフォルダを作る必要があるとのこと
ただし、ディレクトリ名(19.10b0の部分)はBlackのバージョンによって変わる
# from https://dev.infohub.cc/setup-jupyterlab-v200/
mkdir %LocalAppData%\black\black\Cache\19.10b0
ショートカットの設定は以下のようにするとのこと
> - JupyterLabを起動(ブラウザが開く)
> - Settings> Advanced Settings Editor(Ctrl+,) > Keyboard Shortcutsを選択
> - 右側のUser Preferencesに次のコードを追加して保存
keysのところに好きなショートカットを割り当てれば良い。
{ "shortcuts": [ // JupyterLab Code Formatter (black) { "command": "jupyterlab_code_formatter:black", "keys": [ "Ctrl K", "Ctrl D" ], "selector": ".jp-Notebook.jp-mod-editMode" } ], }
### コメント
jupyterlab上でもcodeformatterを使いたかったので、参考にしていきたい。
### 出典
[元記事](https://dev.infohub.cc/setup-jupyterlab-v200/)
毎年恒例の青いR社のエンジニア新卒研修の内容の公開。 昨年と比べてAWS系の研修がかなり多く増えた
気になった研修記事は以下
気になったものは個別にまとめていく予定。
EBSに関して知らなかったことだけ抜粋。
EBSはAZを跨いで利用することができないので、スナップショットを介して持ち出す必要がある。
パフォーマンスに関しては受け手のEC2インスタンス側の性能も大事になってくるとのこと
ほへー
S3に関するアクセス制御方法の紹介がためになった。
意図しない公開を防ぐ仕組みが用意されている。
リソースの外部公開には、大きく分けて2種類の方法がある
使用しなくなったオブジェクトを削除する機構も存在する。
S3のアクセス制御方法が分かりにくかったので、助かった。
RDSの非機能要件を向上させるための機能が紹介されている。
複数のAZにRDSを配置して、随時レプリケーションを行う。
高性能を実現するためには、単純にスペックをあげるのと、読み込み処理の分散が良い
自動バックアップや、cloud watchとの連携が大事
セキュリティにはVPC対応などが必要
勉強になる。
MLチーム立ち上げに関する3つの施策についての紹介
採用には時間がかかるので、メルカリShopsのMLチームでもまず先に採用に取り掛かりました。 社内でその必要性を理解してもらうことからはじめました。
MLに必要なスキルをリストアップし各スキルに対して、Bronze, Silver, Gold のレベルを定義。 同時にMLチームとしてのロードマップも作成。 これによってどの時期にどのようなスキルを持った人材が必要になるかを明確にしました。
スキルマップは採用の解像度を上げるためだけでなく、新しいメンバーが入ってきたときに互いに強みを把握するのにも役立つ
MLが力を発揮できるときに、プロダクトから離れてしまわないように、MLが関われるフェーズの前からブランディングを実施
MLでできることをアピールするにはやはりなんといってもデモ。毎週の全社会のなかでデモの時間が設けられていたので、そこで積極的にMLを使った機能のデモを行いました。
MLの機能開発を始める前に、まず「時が来たときに最速で開発が行えるためのML基盤」の構築から行うことにしました
撰択肢としてはい以下
たまたまvertex AIが発表されたので、それを使うことにしたとのこと。
採用に関する戦略が勉強になった。
フェーズごとにどんなスキルが必要になるかを描いておく必要がある。
M1 Macでdockerを動かすときにbuildできずにはまった。 具体的には以下のようなメッセージがでてbuildが一向に進めなかった。
=> ERROR [internal] load metadata for docker.io/nvidia/cuda:10.1-cudnn7-runtime-ubuntu18.04 0.9s
------
> [internal] load metadata for docker.io/nvidia/cuda:10.1-cudnn7-runtime-ubuntu18.04:
------
failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:18226195b9315f1ef7935ffe353159d6f62d89d1da085c776b23497f46d8e8e8: not found
解決方法としては、build時にplatformを明示的に指定する必要があるとのこと。
dockerコマンドの場合は以下を追加
--platform linux/x86_64
Dockerfileに記入する場合は以下
FROM --platform=linux/x86_64 mysql:8.0
docker-composeの場合は
version: "3"
services:
db:
image: mysql:8.0
platform: linux/x86_64
めっちゃハマっていたので、助かった。
jupyter notebook上でisortを使うための拡張機能
実は最新のisortでは動かず、4.x.x系列じゃないと動かないのが注意。
こう言うコードを綺麗にする系の拡張は、入れていきたい。
jupyter notebook上でblack formatterを使うための拡張。 こっちは特に何もせずに使えるようになる。
特になし
@shinmura0さんのツイートが勉強になったのでメモっておく。
パワー線図からうまく特徴量を抽出して、one class 異常検知を行うというもの。
・音源をFFT(STFT)して周波数-パワー線図を取得 ・この線図の重心(x,y座標)を取得(図参照) (重心の計算方法は以下参照 http://kakukikaku.com/zusin.html)
・重心をプロットし、このプロット上でLOFもしくはIsolationForestを実行 ・図は、プロットの一例(学会で発表済) ・騒音が混じっているため異常音と正常音共通のプロットがあるが、ターゲット音の分布は異なる(矢印部分)
重心法は、正常音が安定&一個の場合は強い。 DCASEのように正常音に多様性があり、雑音が支配的な場合は、弱い。
パワー線図からの特徴量で、やれるときはやれるというのは面白い。
Data-centricなML開発とは、モデルに学習させるデータを工夫して精度向上を行なっていく考え方
具体的には各工程で以下のような点に気を付けていくこと
実際のPJTでは以下のように進めていく
データ作成時はいかにアノテータに品質の高いデータを作ってもらうかに焦点を当てる。
エラー分析時は、モデルの予測結果とアノテーション結果を見比べて、改善点を探る。
ML開発にはパラダイムシフトが来ており、データ作成はある種のコーディング作業であり、PJTを通してiterativeに行う必要があると述べられている。
data-centric!!! とはうえ、データを作成するのには当然コストがかかるので、data-centric / model-centricのバランス感覚が大事。
今後MLチームの競争力は以下のような点になっていくんだろうか
jp_holidayの完全上位互換感あるライブラリ。
2021年8月現在でも更新が続いている上に、振替休日や休日の名前まで取得できる。
以下はREADME.mdからの貼り付け。
# from https://github.com/Lalcs/jpholiday
# 指定日の祝日名を取得
import jpholiday
import datetime
jpholiday.is_holiday_name(datetime.date(2017, 1, 1))
> '元日'
jpholiday.is_holiday_name(datetime.date(2017, 1, 2))
> '元日 振替休日'
jpholiday.is_holiday_name(datetime.date(2017, 1, 3))
> None
# 指定日が祝日か判定
import jpholiday
import datetime
jpholiday.is_holiday(datetime.date(2017, 1, 1))
> True
jpholiday.is_holiday(datetime.date(2017, 1, 2))
> True
jpholiday.is_holiday(datetime.date(2017, 1, 3))
> False
# 指定年の祝日を取得
import jpholiday
jpholiday.year_holidays(2017)
>[(datetime.date(2017, 1, 1), '元日'),
(datetime.date(2017, 1, 2), '元日 振替休日'),
(datetime.date(2017, 1, 9), '成人の日'),
(datetime.date(2017, 2, 11), '建国記念の日'),
(datetime.date(2017, 3, 20), '春分の日'),
(datetime.date(2017, 4, 29), '昭和の日'),
(datetime.date(2017, 5, 3), '憲法記念日'),
(datetime.date(2017, 5, 4), 'みどりの日'),
(datetime.date(2017, 5, 5), 'こどもの日'),
(datetime.date(2017, 7, 17), '海の日'),
(datetime.date(2017, 8, 11), '山の日'),
(datetime.date(2017, 9, 18), '敬老の日'),
(datetime.date(2017, 9, 23), '秋分の日'),
(datetime.date(2017, 10, 9), '体育の日'),
(datetime.date(2017, 11, 3), '文化の日'),
(datetime.date(2017, 11, 23), '勤労感謝の日'),
(datetime.date(2017, 12, 23), '天皇誕生日')]
# 指定月の祝日を取得
import jpholiday
jpholiday.month_holidays(2017, 5)
>[(datetime.date(2017, 5, 3), '憲法記念日'),
(datetime.date(2017, 5, 4), 'みどりの日'),
(datetime.date(2017, 5, 5), 'こどもの日')]
# 指定範囲の祝日を取得
import jpholiday
import datetime
jpholiday.between(datetime.date(2017, 1, 1), datetime.date(2017, 5, 3))
>[(datetime.date(2017, 1, 1), '元日'),
(datetime.date(2017, 1, 2), '元日 振替休日'),
(datetime.date(2017, 1, 9), '成人の日'),
(datetime.date(2017, 2, 11), '建国記念の日'),
(datetime.date(2017, 3, 20), '春分の日'),
(datetime.date(2017, 4, 29), '昭和の日'),
(datetime.date(2017, 5, 3), '憲法記念日')]
# 独自の休日を追加
import jpholiday
import datetime
class TestHoliday(jpholiday.OriginalHoliday):
def _is_holiday(self, date):
if date == datetime.date(2020, 2, 9):
return True
return False
def _is_holiday_name(self, date):
return '特別休暇'
jpholiday.is_holiday_name(datetime.date(2020, 2, 9))
> '特別休暇'
jpholiday.is_holiday(datetime.date(2020, 2, 9))
> True
# 独自の休日を削除
import jpholiday
import datetime
jpholiday.OriginalHoliday.unregister(TestHoliday)
u++さんから教えてもらいましたが、こっちのが良さそう。
Pythonで日本語の感情分析(Google Colab)
pymlaskを用いた感情分析の紹介
入出力の例
どうもポジネガに加えて、感情の強さも抽出できるようだ。
コメント
このようなライブラリがあることを知らなかった。
出典
元記事
pymlask