Mais conteúdo relacionado
Semelhante a 型チェックのアノテーションによる保守・運用の改善 (20)
型チェックのアノテーションによる保守・運用の改善
- 6. 保守の問題:不十分なドキュメント
● ドキュメントが不明慮でAPIの使い方がわからない。
○ 値から値を返す関数なのか、関数を返す関数なのか?
○ APIの仕様がわからないと自分たちのプログラムはメンテナンスできない
● 例1、tensorflowのLSTMCell
○ 関数を返す関数
○ https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/LSTMCell#__call__
○ 入力のパラメータによって出力の型が変わる
● 例2、tensorflowのdynamic_rnn
○ time_majorパラメータで出力のテンソルに転置が起こる。
○ https://www.tensorflow.org/api_docs/python/tf/nn/dynamic_rnn
○ バグ
○ https://github.com/tensorflow/tensorflow/commit/916fcfb39a23afd96893bf85cb6f29c71a483
642#diff-9d717423e6d3f4359151c45dfaa554b6
6
- 8. 機械学習のソフトの問題
● ITのソフト
○ 静的型付け言語・動的型付け言語
○ 扱うデータがクラス単位
○ 文字列・数字・クラスのデータ型で足りる場合が多い
● 機械学習ソフト
○ 動的型付け言語
○ 扱うデータが行列やテンソル
■ 次元や扱う数の精度がコードに明示されていない
■ ドキュメントまたはコードの精読必要
○ 引数の値によってテンソルの次元が変化するものもある
○ ベストプラクティスが確立してない
8
- 9. ITのソフトの場合
● 例:データをAWSのS3にアップロードする場合
○ 静的型付け言語
■ typescript
○ 入力データ(キーとデータを指定する)
■ bucket: 文字列
■ key: 文字列
■ body: Buffer|Uint8Array|Blob|string|Readable
○ リンク
■ https://github.com/aws/aws-sdk-js/blob/master/clients/s3.d.ts
● APIの入出力が定義されているので間違えるところはあまりない。
○ ユーザーはシステム構築に集中できる。
9
- 10. 機械学習のソフトの場合
● 例1:a * b (要素ごとの掛け算)
○ 動的型付け言語
■ python
○ スカラ * スカラ = スカラ
○ 行列 * スカラ = 行列
○ 行列 * 行列 = 行列
○ 入出力にスカラを期待していない場合に問題が検出できない
● 例2:c ? a : bのような条件分岐を入れた場合
● APIが期待と異なる型を容易に入出力できる
○ 些細な問題で躓く
○ ユーザーはシステム構築に集中できない
10
- 11. 改善したい問題
● ライブラリ
○ API のバージョンアップによる非互換を機械的にチェックできない
○ API のインターフェースの仕様が容易にわからない
○ ドキュメントとコードの動作の不一致があっても検出できない
● 保守対象のコード
○ コードの関数・ブロック単位でのレビューが難しい
11
- 13. 既存の手法の確認#依存型
● テンソルの次元を型として扱う
○ Tensor [3,2,2] Float(型名 次元 数値の型)
● Haskellで実用化されつつありtensorflowのAPIも開発中(tensorflow-haskell-deptyped)
● tensorflowの大部分はpythonで書かれており、モデルや最適化のアルゴリズ
ムは非対応なものが多い。
● 下記例(擬似コード)
1. a :: Tensor [2,4] Float
2. a = <中身>
3. b :: Tensor [4,2] Float
4. b= <中身>
5. c :: Tensor [2,2] Float
6. c = a `matmul` b
13
- 14. 既存の手法の確認#型アノテーション
● 型のアノテーション
○ 実際の動作とは関係なく、コメントのようなところに型を付与する。
○ 型が間違っていても動作する。型の検証は別途行う。
● 動的型付け言語でも利用できる。
● 下記の例のようにint(整数)、np.ndarray(テンソル)の型を引数や戻り値に付与
する。(numpy stub)
1. #整 数 型 の ア ノ テ ー シ ョ ン
2. def int func (x : int ) −> int :
3. return x
4. #行 列 型 の ア ノ テ ー シ ョ ン
5. def ndarray func (x : np. ndarray) -> np. ndarray:
6. return x 14
- 15. 既存の手法の確認
● 依存型を用いてテンソルの次元を型で管理
○ 型の例、 Tensor [3,2,2] Float(型名 次元 数値の型)
○ Pros: コード分かりやすく、動作との矛盾・乖離がない
○ Cons: 既存の資産が使えない、型の演算と実際の処理の両方が必要
● 型アノテーションを付ける(mypy)
○ 型の例、 np.ndarray(テンソルの型)
○ Pros: 既存の資産が使え、コード分かりやすい
○ Cons: テンソルの次元が扱えない
15
- 16. 改善したい問題
● ライブラリ
○ API のバージョンアップによる非互換を機械的にチェ
ックできない
○ API のインターフェースの仕様が容易にわからない
○ ドキュメントとコードの動作の不一致があっても検出
できない
● 保守対象のコード
○ コードの関数・ブロック単位でのレビューが難しい
16
- 18. 提案手法#2
1. def cnn_model(features): #関数と入力変数の宣言
2. """Model function for CNN. #関数のドキュメント兼テスト
3. #変数の宣言
4. >>> batch = 7
5. >>> xdat = tf.zeros([batch,784],name="x")
6. #関数の実行
7. >>> cnn_model({'x':xdat})
8. <tf.Tensor 'cnnt/BiasAdd:0' shape=(7, 10) dtype=float32>
9. #関数の出力する期待値デー タでshapeのところで次元がチェックできる.
10. """
11. 関数本体が続く
18
- 20. 提案手法#改善
● 型のチェックの可読性の改善
ーーーー
7. >>> batch = 7
8. >>> inout_eq(cnn_model, ¥
9. in_shape=[batch,784],in_type=tf.float32 ¥
10. out_shape=[batch,10],out_type=tf.float32))
11. True
20