1. 形式検証
2. 説明生成
2.1. 画像の説明を生成するキャプショニングなどがあるらしい(そのほかはどういうものかわからないが…
2.2. アイデアとして、画像認識のDLがどこを見てそう判断したかというデータと元画像を入力として、なぜそう判断したかを生成することはできないか
3. そもそもこの課題の社会的影響は何?
3.1. 人工知能システムの信頼性向上
3.1.1. 人工知能システムの信頼性向上には何が必要??
3.1.2. 説明可能性?
3.1.3. 精度向上?
3.1.4. そもそも人間が何かに信頼を寄せるのに、どういうことを重視している??
4. この課題の目標は?
4.1. アイデア:AIでAIをテストする。イメージはレコメンデーションみたいな(割と)単純なAIシステムに対して、どういうレコメンドが来てほしいかっていうのを学習していくテストAIが戦うようなイメージ
4.2. 自動プログラム修正はどのくらいちゃんとしたテストコードがあれば、正確に動作できるか
4.3. いろんな手法(search-based testing, 敵対的サンプル探索, メタモルフィックテスティング)の、まだできていない部分と、3か月でできるようになるにはどうすればいい?というのを探す
4.4. 結構「システム側だけで考えない」って視点は重要かも。(特に自動運転とかはシステムだけじゃうまくいかないことも多いはずだし)
5. この課題どう進める?
6. 敵対的サンプル探索(Adversarial example)
6.1. DLは人間が知覚できない特徴を学習している→敵対的サンプルはバグではない(要出典)
6.2. 疑問:人間に知覚できないパターンを学習→そもそも説明可能?
6.3. 疑問:特徴量を人間に知覚できるものに制限するべき?
6.3.1. 現実的でなさそう。人間が知覚できるがパターンは人間に気づけないというものが多数あるはず
6.3.2. 人間で知覚できないパターンかどうかってどうやったらわかる(説明できるともいえるかも)
6.4. 疑問:そもそも加工処理した画像にどのくらい意味がある?ノイズを加えたパンダは実世界で存在する?
6.5. 用語:「敵対的摂動(adversarial perturbation)」とは、画像にノイズを入れてモデルをバグらせる方法(摂動→ノイズのこと)
6.6. 敵対的サンプルは"バグ"ではなく意味のある"特徴" この記事にある実験のやり方がよくわからなかった
6.7. 予測特徴にはロバスト、非ロバストがあるかもしれない?ロバストな特徴はノイズがあっても人間と同じ分類をする、非ロバストはしない
6.7.1. 疑問:どういう特徴だとロバストになりがちというのは分類わけされているのか
6.8. 難しいかもしれないが、こっちのほうが資料としては良質かも(AI-SCHLORは文章のミスが多すぎて信用にかける) http://torch.classcat.com/category/adversarial-example/ https://pytorch.org/tutorials/beginner/fgsm_tutorial.html
6.9. AI-SCHLORでサクッとトピック拾って、それを別で調べる(論文貼ってあるのでそれを読む)
6.10. FGSM攻撃→敵対的摂動を加えて、誤認識させる攻撃
7. メタモルフィックテスティング
7.1. 「入力を変えると出力はこう変わるはず」という関係を利用して既存のテストケースから多数のテストケースを生成する
7.2. テストオラクル:テストケースを実行し、期待した結果かどうかを判定する仕組みのこと
7.3. 機械学習システムのテストオラクルは作り易そう(犬かどうかを判定するのは人間には容易、ただし数が多いと大変→Google等の解決方法(ユーザーにやってもらう)はとてもわかり易い)
7.4. ただし、機械学習アルゴリズムが正しくモデルを構築できたかはちゃんとテストできない
7.4.1. 人間には認知できないレベル(能力の限界?)なのかもしれないなぁ
7.5. (メタモルフィック関係(Metamorphic Relation)):「入力に対してある一定の変化を与えたときに、出力の変化が理論上予想できる」という関係
7.6. メタモルフィックテスティングの変換TとTに応じた変換M(T)の関係はテスト可能??
7.7. 似た概念に以下のようなものがある
7.7.1. Nバージョンプログラミング
7.7.1.1. テスト不可能プログラムに対して疑似的なテストオラクルを生成する手法
7.7.1.2. メタモル:2つの入力(元データと変換T後のデータ)を用意する。(一つのソースコードに対する入力が多くなる)
7.7.1.3. Nバージョン:一つの入力に対して複数の実装を用意し、それぞれの実装の出力を比べる(1つの入力に対するソースコードが多くなる)
7.7.1.4. 例:自作Cコンパイラを作ったので、既存のCコンパイラを複数用意して、それぞれの入力と出力を比較する
7.7.1.5. Nバージョンプログラミングでできた複数ソースのうち、比較的にいいものを選らんで、それに対してメタモルフィックテスティングを実施するとかはアリかな??
7.7.2. プロパティベーステスト
7.7.2.1. テストオラクルを具体的な値ではなく、入力の範囲で満たす性質をチェックする
7.7.2.2. 具体例はHaskellのQuickCheckがある
7.7.3. Data Augmentation
7.7.3.1. 既存のデータから新たなデータを生成して水増しする方法(機械学習による手法の一つ)
7.7.3.2. 出力の変化が理論上予測できるように既存の入力を変換し、それらを新たなデータとして加える
7.8. どうやってメタモルフィック関係を作るのさ
7.8.1. 特定方法は難しくないといわれているが、プログラム依存で恣意的(に見える)とのこと
7.8.2. 単純なアプローチ:入力をちょっと変える→出力する、を確認していき一般化していく
7.8.3. 究極のリバースエンジニアリング感がある
7.9. 具体的なイメージが(一般的なプログラムでも)つかない…
7.10. 機械学習の場合はどういう感じなんだろ、変換したら正解ラベルをどうつけるの?
8. サーチベースドテスティング
8.1. メタヒューリスティック:最適化問題(特に組み合わせ最適)の実現可能な現実解
8.1.1. 最適化問題(特に組み合わせ最適)の実現可能な現実解
8.1.2. 結構アルゴリズムの名前が独特で面白い:メタヒューリスティクス - Wikipedia
8.2. facebook の SapFix (自動修正ツール)も search-based testing を使っているっぽい
8.2.1. Facebookのエンジニアリングマネージャーが プログラム解析の大御所
8.2.2. Sapienzという search-based testing ツールを利用して実装されている(ブログによると大した実装はしていないらしい)
8.2.3. 富士通のElixerというのも自動プログラム修正ツール
8.2.3.1. 自動プログラム修正ツールはテストスイートがしっかりしていれば、めちゃ便利そう
8.3. 自動テストスイート生成プログラム EvoSuite | Automatic Test Suite Generation for Java
8.4. search-based testing のまとめの論文 https://mcminn.io/publications/c18.pdf
8.5. 結局どういうことをして、どういうテストが作成されるというのは想像つかない…
8.6. search based testing + Deep learning の論文
8.6.1. DLfuzz
8.6.1.1. DLFuzz: Differential Fuzzing Testing of Deep Learning Systems
8.6.2. DeepExplorer
8.6.2.1. https://arxiv.org/pdf/1705.06640.pdf
8.6.3. TensorFuzz
8.6.3.1. TensorFuzz: Debugging Neural Networks with Coverage-Guided Fuzzing
8.6.4. DeepEvolution
8.6.4.1. DeepEvolution: A Search-Based Testing Approach for Deep Neural Networks
8.6.4.1.1. どんなもの?
8.6.4.1.2. 先行研究と比べて何がすごい?
8.6.4.1.3. 技術や手法のキモはどこ?
8.6.4.1.4. 議論はある?
8.6.4.1.5. どうやって有効だと検証した?
8.6.4.1.6. 次に読むべき論文は?
9. 自動テスト生成
9.1. サーチベースドテスティング等の技術がこれに含まれる
9.2. 自動テスト生成と類似の概念で、自動プログラム修正がある
9.2.1. これもFacebookのSapFix