Open GENZITSU opened 2 years ago
solafuneというプラットフォーム上で開催された衛生画像の超解像コンペの11解法の共有。
要点のみ抜粋
このコンペの当時ではSwinIRというSwin transformerによる超解像モデルが圧倒的に強かったらしい。
最終的な開放は5つのモデルのSeed averaringとTTAの合わせ技を行ったとのこと。
回転のAugmentationを加えるとノイズになる エッジの再現性が重要となる超解像タスクでは,回転後のギザギザがノイズになってしまう. 初めて知ったけど, 超解像タスクでは90度単位での回転が基本動作.画像見比べてなるほどってなった. これは最初気づかなくて,エッジがめちゃくちゃ鈍った画像が生成されたので分析した結果わかったことです.
超解像時にエイリアシングが起きたとき,エッジの向きに再現性がない
結果行き着いた発想が,「エッジに対してLossを計算してしまえばいいじゃない??」でした. 実装上は,Sobel Filterをかけて,エッジ抽出された画像に対してSmooth L1 Lossを計算するように計算しました.
# from https://yuta0306.github.io/mscup-feedback
class MeanSobelError(nn.Module):
"""
Sobel Gradient Loss Function
"""
def __init__(self,
normalized: bool = True,
eps: float = 1e-6,
reduction: str = 'mean',
):
super(MeanSobelError, self).__init__()
self.filter = kornia.filters.Sobel(
normalized=normalized,
eps=eps,
)
self.lossfn = nn.SmoothL1Loss(reduction=reduction)
def forward(self,
y_pred: torch.Tensor,
y_true: torch.Tensor,
):
filtered_pred = self.filter(y_pred)
filtered_true = self.filter(y_true)
loss = self.lossfn(filtered_pred, filtered_true)
return loss
ちなみにsobel filterというのは画像の畳み込みをうまく利用することでエッジ情報を抽出する手法のこと。参考
回転させた時の情報損失が大きいことを初めて知った。
domain randomization的に学習用画像を大量生成するときに注意した方がいいところかもしれない。
またエッジ情報をより見るようにする、ロストしては、ピクセルに対する重み付けというアプローチもあるかもしれない。
衛生画像の建物セグメンテーションとかだと、建物境界付近のロスへの重みを増やして学習させるとかよくやるので。
(今回は、衛生画像オンリーなので、これはできないが、sobel filterを用いて重み付をするとかはできたかも、というか上の手法だと勾配が本当に流れているのかが不明...)
AIで生成された顔写真の画像は、本物の顔写真画像よりも、より「信用できる人」とみなされる傾向があるという報告。
Our evaluation of the photorealism of AI-synthesized faces indicates that synthesis engines have passed through the uncanny valley and are capable of creating faces that are indistinguishable—and more trustworthy—than real faces.
StyleGAN2で生成された顔写真を元に以下3つの実験をしている。
315 participants classified, one at a time, 128 of the 800 faces as real or synthesized.
写真に写っている人種や性別によって正解率が変化したとのこと
For real faces, mean accuracy was higher for male East Asian faces than female East Asian faces and higher for male White faces than female White faces. For both male and female synthetic faces, White faces were the least accurately classified, and male White faces were less accurately classified than female White faces. We hypothesize that White faces are more difficult to classify because they are overrepresented in the StyleGAN2 training dataset and are therefore more realistic.
多少正解率は上がったものの、見た目上ほとんど欠陥がない人工画像もあるので、なかなか難しいとのこと
When made aware of rendering artifacts and given feedback, there was a reliable improvement in accuracy; however, overall performance remained only slightly above chance. The lack of improvement over time suggests that the impact of feedback is limited, presumably because some synthetic faces simply do not contain perceptually detectable artifacts.
Although a small effect, Black faces were rated more trustworthy than South Asian faces, but, otherwise, there was no effect across race. Women were rated as significantly more trustworthy than men,
A smiling face is more likely to be rated as trustworthy, but 65.5% of our real faces and 58.8% of synthetic faces are smiling, so facial expression alone cannot explain why synthetic faces are rated as more trustworthy.
そのうち証明写真を作るノリで、自分の画像をganに取り込ませて、盛れた写真や面接受けのいい写真などに修正してくれるみたいなアプリが出てきそうな感じがする。
AI事業を手掛けるrinna社(東京都渋谷区)は2月22日、恋愛ゲーム「プラスリンクス ~キミと繋がる想い~」(DMM GAMES)に同社の対話AIを搭載したキャラクター「足繁逢(あししげくあい)」が実装されたと発表した。作中では、プレイヤーがチャットで話しかけると、足繁逢がリアルタイムに応答する。
プラスリンクスは、登場キャラクターとチャットをしながら進めるアドベンチャーゲーム。足繁逢には、rinna社の構築済みAIモデルにキャラクターの性格や口調を追加学習させた「STCモデル」を搭載。プレイヤーに対する反応をAIが自動生成する。
STCモデルの出力した文章に合わせて、キャラクターの表情やチャット上の記号などを最適化するAI「Classifierモデル」と組み合わせることで最終的な演出を確定する。
ちなみにSTCモデルとは、rinna社が提唱しているstyle transfer conversationという手法で以下の図のようなことをしているとのこと。(参考)
一昔前にこれと同じようにAI彼女と会話ができるゲームがリリースされて、レスポンス速度が遅くて、蓋を開けてみたら実は中身が人力だったという話があったが、今回は100% AIでリリースするのだろうか?
今後の続報が気になる。
総務省は2月15日、クラウドサービス事業者に対する情報開示の指針「クラウドサービスの安全・信頼性に係る情報開示指針」に、新たにAIを活用したSaaSやASP(アプリケーション・サービス・プロバイダ)に関する指針を追加したと発表した。
AIを使ったSaaSやASPを巡る指針では、セキュリティや災害対策の状況に加え、AIの精度や今後の精度向上に向けた施策の有無など、計106の項目を開示するよう新たに定めた。総務省は今後も必要があれば項目を更新する方針。
クラウド事業者向けにセキュリティやログ取得、災害への対策状況などを公開するよう定めており、IaaS・PaaS編に加えて「医療情報を扱うSaaS・ASP編」「IoT機器を使ったSaaS・ASP編」などの指針を公表している。ただしいずれも努力目標としており、情報を開示しない場合の罰則などは設けていない。
106項目もあるが、大部分は一般的なサービスであれば情報公開して然るべきものからなる。 (会社の代表の名前とか、サービスの提供時間とか)
AIに特徴的な項目は以下
追過学習の有無などについては、事前に握っておかないと、後からトラブルになりそうなので、確かに情報開示しておくメリットがありそう。
努力義務とはいえ、AIの性能が出る環境条件を示しておいた方が良いというのは、なかなかきついかもしれない。
オニヒトデコンペのbestfitting氏の5位解法。
データセットサイズやオニヒトデの画像が少ないことから、copy paste augmentation + poisson blendingという手法を用いて、学習データの増強を行っている。
As the dataset is relative small, if we have more samples we can benefit from them. We can generate more star fishes and put them in different under-sea images.
この解法では、poisson blendingを行った後の画像が本物かどうかを判別するモデルを学習させて、本物と見間違えた画像1.4K枚を学習に加えることで精度の向上に寄与したという。
本物かどうかを判別するモデルは、実際のトレーニングデータをreal, poisson blendingで作成した画像をfakeとして学習させたとのこと。
ちなみに、poisson blendingというのはPoisson Image Editingという論文で提案された、2つの画像をいい感じにマージするCV技術のことで、このgithubを使ったらしい。
マージに必要なmask画像はbbox全体を用いたとのことである。
poisson blending ベースの copy paste + 真贋判定というパイプラインはかなり汎用的なアプローチな気がする。
kaggleのGM nyanpさんが公開した処理時間計測ツール。
pip install ttimerでインストール可能で以下のように使用することが可能で、timerの入れ子構造をサポートしているのが特徴的。
# from https://github.com/nyanp/ttimer
>>> from time import sleep
>>> from ttimer import get_timer
>>> timer = get_timer(timer_name="my timer")
>>> with timer("a"):
>>> sleep(0.1)
>>> for _ in range(10):
>>> with timer("b"):
>>> sleep(0.01)
>>> with timer("b"):
>>> sleep(0.1)
>>> print(timer.render())
path count time own time cpu time own cpu time
------ ------- -------- ---------- ---------- --------------
a 1 0.203831 0.100531 0.001314 0.000784
└── b 10 0.103299 0.103299 0.00053 0.00053
b 1 0.103603 0.103603 8.2e-05 8.2e-05
>>> print(timer.render(flat=True))
path count time own time cpu time own cpu time
------ ------- -------- ---------- ---------- --------------
a 1 0.203831 0.100531 0.001314 0.000784
b 11 0.206903 0.206903 0.000612 0.000612
ちなみに明示的に名前を付けているTimerはすべてスレッドローカルな変数となっており、localなタイマーを使用したい場合は以下のようにインスタンス化する必要があるとのこと。
All named timers are stored as a thread-local variable, and you can use get_timers to enumerate the stored timers. If you do not prefer global (thread-local) variables, you can simply create a local Timer instance. In this style, if you use a decorator, you should pass the timer you created as an additional timer keyword argument.
# from https://github.com/nyanp/ttimer
from ttimer import Timer, timer
t = Timer() # local timer
@timer()
def foo(a: int):
pass
with t("a"):
foo(a=1, timer=t) # additional "timer" keyword argument are used to specify the context
profilerを持ち出すほどではない時に有用そう。
開発速度が高い ということは機能開発の速度が早いのではなく、顧客への価値提供が早いことを指す。
この顧客への価値提供速度最大化するためには以下のことが必要。
金言である。胸に刻みたい。
timmを完全に使いこなすための解説記事。
既知の事項も多いものの、分量が半端ないので、辞書的に使えそう。
株式会社ディー・エヌ・エーの子会社である日本テクトシステムズ株式会社(以下、日本テクトシステムズ)は、日本テクトシステムズが持つ認知機能チェック技術と株式会社NTTドコモ(以下、NTTドコモ)が持つ対話型AIの技術を活用し、電話による認知機能チェック(以下、本ソリューション)を図ることで、高齢化に伴う社会的課題、ヘルスケアに関する課題解決をめざす「AIを活用した電話応対業務の自動化に関する連携協定書」(以下、本協定)をNTTドコモと2022年2月24日(木)に締結しました。
本協定では、日本テクトシステムズが提供する音声で判定する認知機能チェックツール「ONSEI」と、ドコモが提供する電話応対自動化サービス「AI電話サービス」を連携し、電話でAIと会話をすることによって、認知機能をチェックできるサービスの提供をめざします。これにより、利用者は電話を掛ける/受けるだけで認知機能の確認ができます。高齢者の認知機能確認、高齢者運転免許更新時の認知機能事前チェック、企業における従業員のヘルスケア確認などのユースケースで効果検証を進めてまいります。
日本テクトシステムズは、「穏やかに過ごして行ける社会のために」を目指し、「~for peaceful aging~」をコーポレートメッセージに掲げ、前身企業時代から20年以上培った、医療、とくに認知症分野での多岐にわたる知見とICT技術を活かして開発した認知機能検査実施支援システム等を全国の医療機関向けに提供しています。 画像診断装置用プログラム「MRI-TAISEKI」の医療機器認証取得(医療機器認証番号:303AIBZX00004000)や、高齢者運転免許更新時等の認知機能検査に於けるタブレットによる実施~採点~管理システム「MENKYO」、20秒の音声で判定する認知機能AIチェックツール「ONSEI」など他にはないアプローチで社会問題である認知症に対峙する医療ICTベンチャー企業です。
自動音声応答を用いた面白い試み。googleの自動音声案内で営業時間を調べるやつに似た可能性を感じる
機械学習システムに混入する異常入力を4つのケースに分けて、その発生原因・効果的な対処方法が述べられている記事。
勉強になる
WorksApplicationsから国語研日本語ウェブコーパス (NWJC) に対してsudachiを用いて分かち書きを行い、事前学習を行ったBertモデルが公開された。
ライセンスは商用フリー。
以下のように簡単に使用することができる。
$ pip install sudachitra
$ wget https://sudachi.s3.ap-northeast-1.amazonaws.com/chitra/chiTra-1.0.tar.gz
$ tar -zxvf chiTra-1.0.tar.gz
# from https://github.com/WorksApplications/SudachiTra
>>> from sudachitra.tokenization_bert_sudachipy import BertSudachipyTokenizer
>>> from transformers import BertModel
>>> tokenizer = BertSudachipyTokenizer.from_pretrained('chiTra-1.0')
>>> tokenizer.tokenize("選挙管理委員会とすだち")
['選挙', '##管理', '##委員会', 'と', '酢', '##橘']
>>> model = BertModel.from_pretrained('chiTra-1.0')
>>> model(**tokenizer("まさにオールマイティーな商品だ。", return_tensors="pt")).last_hidden_state
tensor([[[ 0.8583, -1.1752, -0.7987, ..., -1.1691, -0.8355, 3.4678],
[ 0.0220, 1.1702, -2.3334, ..., 0.6673, -2.0774, 2.7731],
[ 0.0894, -1.3009, 3.4650, ..., -0.1140, 0.1767, 1.9859],
...,
[-0.4429, -1.6267, -2.1493, ..., -1.7801, -1.8009, 2.5343],
[ 1.7204, -1.0540, -0.4362, ..., -0.0228, 0.5622, 2.5800],
[ 1.1125, -0.3986, 1.8532, ..., -0.8021, -1.5888, 2.9520]]],
grad_fn=<NativeLayerNormBackward0>)
Amazon Review Corpusに対してファインチューニングを例に撮った解説記事もあり、だいたい6割程度の正解率となっている(※参考)
sudachiはmecabよりもトークナイザーとしての使用感が良いイメージがあるので、事前学習モデルの精度にも期待がもてる。
OpenVINO, TensorRT, TVMといった様々な深層学習モデルの最適化を簡単に実行することができるライブラリ。
pytorch, tensorflow, haggingface(coming face)のライブラリを以下のような使用感のようで最適化が可能。
# from https://github.com/nebuly-ai/nebullvm
>>> import torch
>>> import torchvision.models as models
>>> from nebullvm import optimize_torch_model
>>> model = models.efficientnet_b0()
>>> bs, input_sizes = 1, [(3, 256, 256)]
>>> save_dir = "."
>>> optimized_model = optimize_torch_model(
... model, batch_size=bs, input_sizes=input_sizes, save_dir=save_dir
... )
>>> x = torch.randn((bs, *input_sizes[0]))
>>> res = optimized_model(x)
ただし、手元の環境でインストールしようとしたらnebullvm==0.1.1とnebullvm=0.1,0が矛盾して使用することができなかった。
今後に期待
界隈で話題になっている記事。 target encodingを行う際に、クラス数が少ない場合encoding結果が信頼できない問題があり、これまではadaptive smoothingなどのテクが用いられていたが、ここにp値を用いることで、atmaCup13でスコアが改善したことが報告されている。
計算は以下のように行うが、連続修正というものを使うことでより適切な値になるのだとか
target encodingの派生系は色々あるらしいので、また勉強してみたい。 TargetEncodingのスムーシング
Bag of Wordsから近年のBERTの進化系までが完結にまとめられている。
ここ最近の進化の系譜を振り返るのにちょうどよい。
GCPが提供するマネージドなベクトル検索エンジン、Vertec AI Matching Engineを採用した経緯などがまとめられている。
オープンソースなFaissはベクトルに対応するIDの生成に制約があるため、Faiss用のIDと自社内でのIDのマッピングを管理する必要がでてくるのだが、このIDは頻繁に更新されるため結構な頻度で障害につながっていたとのこと。
Mathinc Engineでは idに任意のな UTF-8 文字列を使えるため、マッピングの管理が必要なくなり、これだけで障害耐性が向上。 さらにダウンタイムなしでindexのアップデートを行う機能も有しているということで、自社でベクトル検索エンジンを運用するよりもはるかに高機能なものがつかえるという。
メモ
[✅] MLMs trained with 40% masking can outperform 15%. [✅] No need for making with 80% [MASK], 10% original token and 10% random token. [✅] Uniform masking can compete with {span, PMI} masking at higher masking rates.
BERTの事前学習時のMASK確率を15%から40%に引き上げることで、言語モデルの性能が向上することを示した論文。
ただし、80%マスキングした言語モデルでも各種タスクで性能を保持している傾向があり、これは黄色信号な気がしている(感想)
またBERTのマスキング手法にはいくつかの流派があったが、シンプルな一様サンプリングベースのマスキングでも十分に性能が出ることを示した。
BERTの事前学習のマスク確率が一種のハイパラだったというのは意外だ。
DataLoader作成時にDistributedSamplerを指定し、かつdrop_lastをTrueにしておかないと、重複サンプリングが発生するとのこと。 安全に使うにはpytorch 1.8以上が良さそう
PyTorch DDP(分散学習時)で、DataLoader作成時にDistributedSamplerインスタンスを指定しないと各プロセス(GPU)に全サイズのデータセットが行っちゃうん?
これ実際に調べたけどYesだったな。 DistributedSamplerを指定しない場合二つのプロセスに同じサンプルを送っている(1枚目) 指定すると重複しないようプロセスごとに分割しておくっている(2枚目) ということでDistributedSamplerを指定し忘れると2重に学習してることになるとさ
重複してサンプリングされるのを防ぐにはDistributedSamplerのオプションでdrop_last=Trueにする。分散学習じゃないときのDataLoaderのdrop_lastと同様。ただし、DistributedSamplerにdrop_lastオプションが追加されたのはPyTorch 1.8.0以降
メモ
AI倫理が問われた事例の紹介や世界各国の動向が完結にまとめられた資料。
世論の方向によっては、AIのアプリケーション先も限定されてきてしまうので注視していきたい。
衛星画像のdeppfakeという文脈で、CycleGANを用いてゴルフ場衛星画像 ⇆ 非ゴルフ場衛星画像の変換を行わせて、ゴルフ場分類機を騙せるかどうかを試した記事。
https://github.com/junyanz/pytorch-CycleGAN-and-pix2pixのコードを用いてgoogle colabで200epochほど学習を行い、以下のような生成画像を得ている。
ゴルフ場を消す方向
ゴルフ場を生成する方向
実際に、学習したGANでゴルフ場を生成/消すとゴルフ場判定機を騙せることを確認している。(すなわち衛星画像deppfakeの可能性をサポート)
面白い。
表題の通り。rinna社から公開されたGPT-1bを用いて、promtベースで以下のようなタスクを解かせている記事。
実装付きということで使うときに参考になりそう。
# from https://data-analytics.fun/2022/02/23/gpt-1b/
input_ids = tokenizer.encode(prompt, return_tensors="pt",add_special_tokens=False).to(device)
with torch.no_grad():
output = model.generate(
input_ids,
max_length=100,
min_length=100,
do_sample=True,
top_k=500,
top_p=0.95,
pad_token_id=tokenizer.pad_token_id,
bos_token_id=tokenizer.bos_token_id,
eos_token_id=tokenizer.eos_token_id,
bad_word_ids=[[tokenizer.unk_token_id]],
num_return_sequences=5
)
decoded = tokenizer.batch_decode(output,skip_special_tokens=True)
for i in range(num_return_sequences):
print(decoded[i])
メモ
差分プライバシーに配慮した学習では、DP-SGDという方法がよく用いられるが、勾配にノイズを加えるためモデルの性能とのトレードオフが往々にして発生する。
Differentially-Private Stochastic Gradient Descent (DP-SGD) が広く知られています.SGDを拡張したもので,勾配を一定のノルムでクリッピングし,更にノイズを加算することで差分プライバシを満たした学習を実現します.差分プライバシを満たせる一方で,得られるモデルの有用性が低下するというトレードオフがあります.プライバシ保護をしても有用な出力が得られないモデルでは意味がないため,プライバシ強度は落とすことなく有用性を改善する必要があります.
これに対して、DNNのようなオーバーパラメトライズされたモデルは時に重要でないパラメータが出てくるという性質を用いることで、性能を改善することができることが知られている。
様々な先行研究により,ニューラルネットワークパラメータには出力への寄与が大きい重要なものとそうではないものが混在していることが知られています.この偏りはパラメータを行列として見たときに低ランク性やスパース性という形で現れます.この点に注目し,重要ではない重みの更新をスキップすることで,DP-SGDのクリッピングやノイズの影響を減らし,有用性を改善するという既存研究があります.
このインターンではこの重要出ないパラメータ(勾配)を特定するのに以下のような手法を提案し、先行研究よりもよりパラメータ数を減らすことを可能にし、差分プライバシーを保ちつつモデルの性能を下げないことを確認した。
これまで排他的だった低ランク性とスパース性の併用を,ユニットレベルの重要度を定義することで実現します.入力側ユニットと出力側ユニットのぞれぞれで接続されているシナプスの重要度の総和を計算し,それを各ユニットの重要度として定義します.任意の低ランク化手法で分解された勾配行列 (∂L,∂R) を取得した後,各ユニットがランク分解された行列にも対応があることを利用してスパース化を行います.具体的には,入力側ユニットが ∂L の行と,出力側ユニットが ∂R の列と対応するため,それぞれで重要度の低い p% のパラメータを更新対象から除外します
この分野に知見がなかったので、勉強になった。
表題の通り。
optunaで最適化するコードは以下
# from https://zenn.dev/nishimoto/articles/f2af21c24413d3
import torch
import pandas as pd
from pytorch_tabnet.tab_model import TabNetRegressor
def objective(trial):
mask_type = trial.suggest_categorical("mask_type", ["entmax", "sparsemax"])
n_da = trial.suggest_int("n_da", 8, 64, step=8)
n_steps = trial.suggest_int("n_steps", 1, 10, step=3)
gamma = trial.suggest_float("gamma", 1.0, 2.0, step=0.2)
n_shared = trial.suggest_int("n_shared", 1, 3)
lambda_sparse = trial.suggest_float("lambda_sparse", 1e-6, 1e-3, log=True)
tabnet_params = dict(
n_d=n_da, n_a=n_da, n_steps=n_steps, gamma=gamma,
lambda_sparse=lambda_sparse, mask_type=mask_type, n_shared=n_shared,
optimizer_fn=torch.optim.Adam,
optimizer_params=dict(lr=2e-2, weight_decay=1e-5),
scheduler_params=dict(
mode="min", patience=10,
scheduler_fn=torch.optim.lr_scheduler.ReduceLROnPlateau,
verbose=0,
)
)
model = TabNetRegressor(**tabnet_params)
model.fit(
X_train=trn_x, y_train=trn_y,
eval_set=[(val_x, val_y)],
patience=15,
max_epochs=100,
eval_metric=['rmse']
)
メモ
TransformerモデルへのMC Dropoutの適用
学習時だけではなく推論時にもドロップアウトを利用することで、予測の確実性を見積もる手法の実装記事。
ブログ中では20newsという英語の文書分類タスクに対してドロップアウト確率を0.5と高めに設定して実装を行っている。
このモデルで普通に学習させた後に、model.eval()をせずに、100買い推論を行い最頻値の値がどれくらい出たかで確信度を見積もっている
コメント
元々は回帰問題に対する確信度を見積もるための手法だったらしいが、分類にもある程度使えそう。
仮にマルチラベルとかで各深度を見積もる場合は、複数回やった予測分布の平均からの乖離みたいなのを指標として用いればいいのだろうか?
そしてどうやらタスクによって絶大な効果をもたらすらしい。
出典
元記事