GENZITSU / UsefulMaterials

34 stars 0 forks source link

weekly useful materials - 05/25 - #100

Open GENZITSU opened 2 years ago

GENZITSU commented 2 years ago

“スマホのマイクでこっそり盗聴”を妨害する技術 静かな音で会話内容を改ざん

自動音声認識機による盗聴を人間は気づかないような微弱な音でリアルタイムで妨害する技術がコロンビア大学から発表された。

提案手法ではリアルタイムな妨害を行うために、入力系列から数秒先の発話に対して最も効果的なadversarial attackを仕掛けるようにモデルを訓練したとのこと。

スクリーンショット 2022-05-20 22 56 03

スクリーンショット 2022-05-20 22 56 37

モデルの構造などは以下、確かにこれは早そう

The input to our network is the Short-Term Fourier Transform (STFT) of the last 2 seconds of the speech signal. The network outputs a waveform of 0.5 seconds, sampled at 16kHz. To calculate the STFT, we use a hamming window length of 320 samples, hop length of 160 samples, and FFT size of 320, resulting in an input dimension of 2 × 161 × 204. We use a 13 layer convolutional network. The architecture is comprised of 8 down-sampling convolutional blocks, followed by 4 up-sampling convolutional blocks, followed by a linear layer.

この妨害方法を用いた定量評価が以下 DeepSpeechに対してはwhiteboxの設定で、adversarial attackの方法を学習した上で攻撃を仕掛けて、WAV2VECに対してはblack box設定で特段学習せずに突っ込んでいる。

Language modelを乗り越えて攻撃成功しているところがすごい。

スクリーンショット 2022-05-20 22 57 58

実際の部屋で攻撃した結果も載せており、white noizeよりも明らかに認識間違いが上昇していることがわかる。

スクリーンショット 2022-05-20 22 58 48

コメント

adversarial exampleが社会の役に立つ稀有な例。数秒先の発話に対するadversarial attackを作るという発想が素晴らしい。

出典

GENZITSU commented 2 years ago

NTTが画像認識AIでインフラ設備の「錆」を高精度に検出する技術を発表 老朽化の進行/点検コスト増加/点検員不足に対応

車両に搭載したカメラで撮影した画像からインフラ設備の錆を検出するシステムがNTTから発表

いかのような車両で

スクリーンショット 2022-05-20 23 36 16

以下のようなパイプラインで推論をかけている

スクリーンショット 2022-05-20 23 36 34

以下が定量評価と定性評価。

やけに高い精度であるのは、分子分母が画像単位で集計されているから。

スクリーンショット 2022-05-20 23 37 22

スクリーンショット 2022-05-20 23 37 31

スクリーンショット 2022-05-20 23 37 38

コメント

各構造物のsegmentationまでやってるので、すごいコストかけたんだろうなあと思ったら以下のような記載が

この画像認識AIは、実地で取得した合計数万枚のインフラ設備と発生した錆の画像を学習させており、対象を特定の設備に限定することなく、複数のインフラ管理者で活用できる。

NTTの本気さが伺える...

出典

NTTが画像認識AIでインフラ設備の「錆」を高精度に検出する技術を発表 老朽化の進行/点検コスト増加/点検員不足に対応

GENZITSU commented 2 years ago

TF-IDFの理論的な意味付けについて

TF-IDFを文章全体に出現する単語wの分布と対象文章に出現する単語wの分布のKLに相当するという考察。

スクリーンショット 2022-05-23 23 08 44

コメント

そのような意味合いがあるのは面白い。TF-IDFがいまもstrongなベースラインである背景なのかもしれない。

SNSで教えてもらったが、このような定式化方法もあるとのこと

情報検索は、クエリ q に対し、もっとも適合する文書 d_opt を求めるタスクです。つまり、q が与えられたとき、文書 d が出現する確率 p(d|q) の最大化問題と解釈できます。 d_opt = argmax P(d|q)

キーワード抽出: tf-idf の意味づけ

出典

TF-IDFの理論的な意味付けについて

GENZITSU commented 2 years ago

AWS Machine Learning Specialty合格体験記

以下のコンテンツを用いて学習を進めて見事合格したとのこと

「ディープラーニングを支える技術 - 『正解』を導くメカニズム[技術基礎] 」  →機械学習、深層学習の用語やパラメータ、計算式についてわかりやすく、詳しく解説しているので超お勧めです。

「Kindle : AWS Certified Machine Learning Specialty Best Practice Exam Japanese 」  →試験範囲の各セクション(1.データエンジニアリング、2.探索的データ分析、3.モデリング、4.機械学習の実装とその運用)毎に問題をまとめており、勉強が進めやすい。他の対策問題集だと、出題範囲からランダムに問題が出るため、勉強しづらい。

コメント

機械学習のバックグラウンドがある人にとってはハードルが下がるのかもしれないので狙っていきたい。

出典

AWS Machine Learning Specialty合格体験記

GENZITSU commented 2 years ago

英当局、顔認識テクノロジーの「Clearview AI」に罰金12億円

英国の個人情報保護監督機関(ICO)は5月23日、Clearview AIがインターネットやSNSから、200億枚以上の画像を違法に採取して、グローバルな顔認識データベースを作成したと発表した。ICOは、警察や法執行機関を含む顧客らが同社のデータベースを利用していると述べている。

Clearview AIは、すでに英国でのサービスを中止しているが、ICOは、同社のデータベースに「かなりの量の英国居住者のデータ」が含まれていると述べている。

ICOは、Clearview AIが個人の同意を得ずにデータを収集して無期限に保持しており、英国の複数の法律に違反していると述べた。同機関はClearview AIに940万ドル(約12億円)の罰金の支払いを命じ、英国居住者のデータの削除と運用の停止を求めている。

コメント

インターネット上に公開されているからと言って無邪気に学習データに利用してしまうと、著作権やらプライバシーの侵害につながってしまうことがあるので、実務では当然そこらへんをちゃんと確認した上で利用しないといけない。。

出典

英当局、顔認識テクノロジーの「Clearview AI」に罰金12億円

GENZITSU commented 2 years ago

カード名を入れるとそれっぽいカードを作ってくれるサイト「urzas.ai

カード名を入れるとAIで以下のような感じでカードを作ってくれるサイト

スクリーンショット 2022-05-24 19 11 07

カードの効果はco:hereというサービス経由で大規模言語モデルをfine-tuningしている。
カードの絵の方はdreamサービスを用いて大規模マルチモーダルモデルをfine-tuningしている。

コメント

発送は面白いが、現状の精度はまだまだ感

出典

GENZITSU commented 2 years ago

私のブックマーク:不均衡データ分類

2022年5月に公開された不均衡データ分類を行う際の対策方法がまとめられたページ。

サンプリングアプローチ, コストアプローチ, アンサンブルアプローチ, その他という分類で、約70本の論文がまとめられている。

コメント

メモ

出典

私のブックマーク:不均衡データ分類

GENZITSU commented 2 years ago

インフラ点検向けに数枚の正常画像から異常個所を世界最高精度で検出するAIを開発 from 東芝

数枚の正常画像だけで異常箇所を高精度に検出できる技術が東芝から発表された。 今回の技術はICIAP2022という学会で5/25に発表される予定とのこと。

以下技術概要

画像を用いた異常検知の手法は一般的には以下の要な手法が用いられ、

スクリーンショット 2022-05-24 21 33 54

画像枚数が少ない設定ではImagenetなどで事前学習したモデルから導出される特徴量を用いた手法が用いられることがあるが、これらの手法では対象物を同じような画角で撮影することが前提となっている。

スクリーンショット 2022-05-24 21 34 03

今回の手法では、正常画像中の分散を算出したした異常マップから割り引く形で、この問題の解決を行っている。

スクリーンショット 2022-05-24 21 34 11

スクリーンショット 2022-05-24 21 34 20

スクリーンショット 2022-05-24 21 34 31

コメント

まだ論文のリンクが見つかっていないので、会議での発表後に詳細を追っていきたい。

出典

インフラ点検向けに数枚の正常画像から異常個所を世界最高精度で検出するAIを開発

GENZITSU commented 2 years ago

1ペタバイトのデータセットで機械学習する / WebDataset入門

pytorchでの学習時にクラウドストレージなどからのデータを読み込みサポートするWebDatasetの解説とパフォーマンス実験を行っている記事。 WebDatasetを用いたデータの読み込み方法が具体的に記載されていて勉強になる。

WebDatasetは以下のような代表的なデータセットロードシナリオに対して、小規模なデータサイズからペタバイト単位のデータサイズまでを統一的に扱えるインターフェースを提供している

(1) オンメモリ (2) ローカルディスク (3) Web/ファイルサーバー (4) クラウドストレージ (5) 高速分散ストレージシステム

tensorflowにもTFRecordなるものがあるが、WebDatasetではPOSIX tar形式のファイルも読み込めるのが特徴的で、pure pythonで実装されているので依存性も少ない。

基本的な使い方 (ローカルからの呼び出し)

# from https://zenn.dev/turing/articles/petabyte_webdataset

import torch
import webdataset as wds

url = "/tmp/publaynet_000000.tar" or url = "/tmp/publaynet_{000000..000009}.tar"

# ローカルファイルパスをセットします.
dataset = wds.WebDataset(url)
# データパイプラインの定義(デコード、タプル化).
dataset = dataset.decode("rgb").to_tuple("png", "json")

# データを取得します.
image, json = next(iter(dataset))
print(image.shape, image.dtype, type(json))  # (794, 610, 3) float32 <class 'dict'>

前処理などのパイプラインは以下のように記述できる

# from https://zenn.dev/turing/articles/petabyte_webdataset

def preprocess(sample):
    image, json = sample
    try:
        label = json["annotations"][0]["category_id"]
    except Exception:
        label = 0
    return image, label

dataset = dataset.map(preprocess)

from random import randrange

def get_patches(source):
    for sample in source:
        image, label = sample
        # サンプリングされた画像のheight/widthを取得します.
        h, w = image.shape[:2]
        for _ in range(16):
            y, x = randrange(h - 256), randrange(w - 256)
            patch = image[y : y + 256, x : x + 256]
            yield (patch, label)

dataset = dataset.compose(get_patches)
dataset = dataset.shuffle(10000)  # バッファーサイズ=10000でシャッフルします.

あとはこれをDataLoaderに渡してやればいつものように学習が可能

webサーバからの読み出し

以下のようにurl部分を変えるだけで良い。そして学習前にデータセットを落としておく必要はなく、ストリーミングで取得してくれるので、ローカルストレージを圧迫させなくて済む。

# from https://zenn.dev/turing/articles/petabyte_webdataset

import torch
import webdataset as wds

url = "http://storage.googleapis.com/nvdata-publaynet/publaynet-train-{000000..000009}.tar"
dataset = wds.WebDataset(url)
dataset = dataset.decode("rgb").to_tuple("png", "json")
dataset = dataset.map(preprocess)
dataset = dataset.compose(get_patches)
dataset = dataset.shuffle(10000)

dataloader = torch.utils.data.DataLoader(dataset, batch_size=64, num_workers=4)

images, labels = next(iter(dataloader))
print(images.shape, labels.shape)  # torch.Size([64, 256, 256, 3]) torch.Size([64])

S3からの読み出し

S3からオブジェクトをバイトストーリムとして読み出す方法とS3バケットをファイルシステムとしてマウントする方法が有望とされている。(SageMakerパイプモードを利用する手もあるらしい)

S3からオブジェクトをバイトストーリムとして読み出す方法はWebDatasetのurl_openerをs3用にオーバーライドすることで利用可能になる

# from https://zenn.dev/turing/articles/petabyte_webdataset

import io
import re

import boto3

client = boto3.client(
    "s3",
    aws_access_key_id=os.environ["AWS_ACCESS_KEY_ID"],
    aws_secret_access_key=os.environ["AWS_SECRET_ACCESS_KEY"]
)

def get_stream(path):
    stream = io.BytesIO()
    _, bucket, key, _ = re.split("s3://(.*?)/(.*)$", path)
    client.download_fileobj(bucket, key, byte_io)
    stream.seek(0)
    return stream

def url_opener(data, handler=reraise_exeption, **kwd):
    for sample in data:
        url = sample["url"]
        try:
            stream = get_stream(url)
            sample.update(stream=stream)
            yield sample
        except Exception as e:
            e.args = e.args + (url,)
            if handler(e):
                continue
            else:
                break

# url_openerをオーバーライドします.
wds.tariterators.url_opener = url_opener

urls = [f"s3://<path of dataset>/publaynet_{i:06d}.tar" for i in range(10)]
dataset = wds.WebDataset(urls)

S3バケットをファイルシステムとしてマウントする方法は専用のライブラリを用いた上で、url_openerをオーバーライドすることで利用可能

# from https://zenn.dev/turing/articles/petabyte_webdataset

# 注: はじめにstart methodをspawnにする必要があります.
torch.multiprocessing.set_start_method("spawn")

import s3fs

fs = s3fs.S3FileSystem(
    key=os.environ["AWS_ACCESS_KEY_ID"],
    secret=os.environ["AWS_SECRET_ACCESS_KEY"]
)

def url_opener(data, handler=reraise_exeption, **kwd):
    for sample in data:
        url = sample["url"]
        try:
            stream = fs.open(url.replace("s3://", ""), mode="rb")
            sample.update(stream=stream)
        except Exception as e:
            e.args = e.args + (url,)
        if handler(e):
            continue
        else:
            break

# url_openerをオーバーライドします.
wds.tarietators.url_opener = url_opener

urls = [f"s3://<path of dataset>/publaynet_{i:06d}.tar" for i in range(10)]
dataset = wds.WebDataset(urls)

パフォーマンス比較

ローカルストレージから直接読み出してくるのが最も早いが、webから引っ張ってくる方法とs3から引っ張ってくる方法もかなり良い。

スクリーンショット 2022-05-24 22 18 27

コメント

学習データの枚数が増えていくにつれて、ローカルストレージを大きくする必要があったり、データの移動時間が長くなってきたりする問題を緩和するための手法として勉強になった。
あんまり軽いモデルだとデータ転送の時間がボトルネックになりそうだが、ビデオ系が入力であればpre_fetch機能などを使うことでデータの読み込みとモデル学習にかかる時間をうまくやりくりできそう。

出典

1ペタバイトのデータセットで機械学習する / WebDataset入門

GENZITSU commented 2 years ago

Hugging Faceで使える医療分野のモデルまとめ(22/5 時点)

表題の通り

下記のモデルごとにpaper / github / weightsがまとめられている。

スクリーンショット 2022-05-24 23 08 25

コメント

ありがたい。

出典

Hugging Faceで使える医療分野のモデルまとめ(22/5 時点)

GENZITSU commented 2 years ago

サーバサイドのCPUによるAI推論の速度改善

CPUでDNNモデルを高速推論できるフレームワークの紹介とパフォーマンス測定を行っている記事。

CPUによるDNNモデルの高速推論の原理

AIテスト環境で使用しているAWSのインスタンスは、m5.largeやc5.largeのようなIntelのXeonプロセッサを搭載したもの Xeonプロセッサは、AVX512(Intel Advanced Vector Extensions 512)というSIMD命令に対応しており、512bit長のレジスタ上に並べられた数値群に対して並列演算を行う事で高速に計算処理ができる

DNNモデルの計算処理は大半がCNNによる積和演算(MAC:Multiply-ACcumulate operation)になりますが、昨今のAVX512ではDL boostのようなINT8の積和演算専用の命令セットが用意される等してAI処理を高速に処理できるようになってきています(なお、今回の記事ではINT8量子化まではしなかったため、DL Boostは使われていません)。

AVX512の命令セットを使えば高速にAI推論処理を実行できる事になりますが、これらの命令セットを使用して高速推論を実行できる推論エンジンが存在しているので、それらを使う事で直接SIMD命令を使ったコーディングをするような必要はありません。

代表的なフレームワークは下記4つ

ONNX Runtime

MSが開発しているこの手のツールでは一番有名なフレームワーク。
tensorflowやpytorchがONNXへの変換をサポートしているほか、使用可能な言語もpython, java, c++, Rustなど多岐に渡る。
さらにWASMやWebGLを用いたブラウザ推論をサポートするonnx-runtim-webというものも存在する

OpenVINO

Intelが開発している推論エンジンで、AVX512に対応したCPUやIntel製のGPU, VPU(*1), FPGA上で高速に動作する。

ONNXから型式のファイルを読み込むことで使用可能になる。

言語としてはPython C/C++, rustなどがサポートされている。

スクリーンショット 2022-05-25 0 21 53

DeepSparse

Neural Magic社が開発しているIntel CPU上で動作する推論エンジン。

モデルのsparse化を行った上で、各CPUコアの並列演算を深さ方向に実行する方法を取ることで、CPUの大きなキャッシュを生かすことで、高速推論を可能にするとのこと (詳しくはこちら)

スクリーンショット 2022-05-25 0 24 15

DeepSparseをより高速に用いるためにはpruningとquantizationといった再学習が必要になるが、なくてもonnxより速くなったりするらしい。

スクリーンショット 2022-05-25 0 34 19

対応言語はPythonとC++のみで、実行環境もLinuxのみとなっている。

ちなみにDeepSparseもonnx形式のファイルから推論が可能とのこと

Apache TVM

Apachが開発している推論エンジンで、pytorchやtensorflwoなどの様々なDLフレームワークで書かれたモデルをデバイスごとにコンパイル/最適化することで高速推論を可能にする。

スクリーンショット 2022-05-25 0 37 36

対応言語はPython, C++に加えてGo, Javaなど多岐にわたる

ただしチューニングには一癖あるらしい。

パフォーマンス比較

測定用プログラムはPythonで実装を行いました。使ったモジュールのバージョンはそれぞれPyTorchがv1.10.1、ONNX Runtimeがv1.11.0、OpenVINOが2021.4.689、DeepSparseが0.11.2となっています。

測定環境にはAWSのc5.largeインスタンス(物理コア数1)を使用しました。

ウォームアップ用に5回推論処理を行い、その後50回推論処理を実行してその平均時間を測定しています。

スクリーンショット 2022-05-25 0 38 58

ONNXも早いのだが、deepsparse, openvinoもかなり早いという結果に

またCPUコア数が増えることで推論速度がさらに向上することも確認

スクリーンショット 2022-05-25 0 40 52

コメント

推論エンジンを用いた最適化だけでここまで速度が変わるのはすごい。
とりあえずONNX形式にしておいて、それでも物足りない時にOpenVINOやDeepSparseを用いてみるというのが良さそう。

出典

サーバサイドのCPUによるAI推論の速度改善