Pythonはどうやって動くのか / Python 10

A10e41b0a61d59f2258d7f6172c33479?s=47 kaityo256
December 10, 2019

Pythonはどうやって動くのか / Python 10

プログラミング基礎同演習10

A10e41b0a61d59f2258d7f6172c33479?s=128

kaityo256

December 10, 2019
Tweet

Transcript

  1. 1 Pythonはどうやって動くのか プログラミング基礎同演習 慶應義塾大学理工学部物理情報工学科 渡辺 2019/12/10 #プロ同演習

  2. 2 入力 出力 同じになる ように学習 入力 出力 グレッグ・イーガン「ぼくになることを」等 AI AI

    「スイッチ」により、この人の意識は失われたか?
  3. 3 uint8 8ビット 符号なし 整数 unsigned integer 0 〜 255までの整数を表現できる

    8ビットで表現可能な情報 個 int8 8ビット 符号つき 整数 signed integer 0-128 〜 127までの整数を表現できる
  4. 4 ෨ = x Σ Σ† 行列とみなして低ランク近似 画像が黒飛びしているところがある これは、オーバーフローが原因 ratio

    = 0.05
  5. 5 u, s, v = linalg.svd(a) x x = †

    Σ ur = u[:, :rank] † vr = v[:rank, :] sr = np.matrix( linalg.diagsvd( s[:rank], rank, rank)) Σ = ሚ x x b = np.asarray(ur*sr*vr) 特異値分解 一部分だけ取り出す 行列の再構成(低ランク近似)
  6. 6 フロベニウスノルム ベクトルの長さを行列に一般化したもの = ሚ x x 特異値分解の一部分から再構成した行列は元の行列よりランクが減る > ※

    ランク(階数):行列の一次独立な固有ベクトルの本数=行列の情報量 特異値分解は、フロベニウスノルムの意味で最良近似行列を与える
  7. 7 ሚ x x ≒ ≒ = √ x √

    = x 特異値分解は両者の画素値の差の二乗を小さくしようとする 例えば255を 258と近似 オーバーフロー 黒飛び ratio = 0.1
  8. 8 def svd(url, ratio=0.1): gray_img = mono(url) a = np.asarray(gray_img)

    w, _ = a.shape rank = int(w*ratio) u, s, v = linalg.svd(a) ur = u[:, :rank] sr = np.matrix(linalg.diagsvd(s[:rank], rank, rank)) vr = v[:rank, :] b = np.asarray(ur*sr*vr) b = np.clip(b, 0,255) return Image.fromarray(np.uint8(b)) 最大値を255に制限してやる ratio = 0.05 (clipなし) ratio = 0.05 (clipあり)
  9. 9 Pythonが動く仕組み 抽象構文木 仮想マシンとバイトコード

  10. 10 コンピュータは 1. メモリから命令とデータを取ってくる 2. 命令に従って演算器にデータを投げる 3. 演算器から返ってきた結果をメモリに書き戻す という処理を繰り返す メモリ

    CPU 演算器 発注 製造依頼 製品 納品
  11. 11 整数を二つ受け取って四則演算をして返す計算機を考える 「3+4」や「8-5」という式を数字で表現 演算方法を数字で表現する 0 + 1 - 2 ×

    3 ÷ 命令表(オペコード) 例えば「3+4」は「0,3,4」、「8-5」は「1,8,5」で表す 0 3 4 opcode operand 何をするか データ
  12. 12 0 3 4 1 8 5 メモリ メモリから命令とデータを取ってくる 0

    3 4 opcode operand 命令表を見て、どの演算 器に投げるか決める 加算器 減算器 乗算器 除算器 3 4 0 + 1 - 2 × 3 ÷ 命令表(オペコード) 0
  13. 13 機械語は数字の羅列 コンピュータは機械語しか理解できない 「3+4」は「0,3,4」という数字列で表現 機械語 (Machine Language) アセンブリ言語 (Assembly Language)

    「0,3,4」が「3+4」というのは分かりづらい 機械語と一対一対応する形でわかりやすく 0 3 4 opcode operand ADD 3,4 アセンブラ ※ 実行バイナリ作成にはリンカも必要
  14. 14 ADD 3,4 アセンブリ言語 (Assembly Language) ではまだわかりづらい 機械語はCPUによって異なる → アセンブリ言語もCPUによって異なる

    → 人間にわかりやすい形、かつ共通な書き方をしたい プログラム言語 (Programming Language) 3+4 人間がわかりやすい形で書く ADD 3,4 アセンブリに変換 機械語に変換 0,3,4 ここの変換を行うのがコンパイラ アセンブラ
  15. 15 「3+4」を「ADD 3, 4」に変換したい・・・どうやって? 字句解析 "3 + 4" プログラムを意味のある最小単位(トークン)にバラす 3

    + 4 数 加算記号 数 構文解析 トークンの関係を解析する 3 + 4 3 + 4 抽象構文木(Abstract Syntax Tree, AST)
  16. 16 プログラム 抽象構文木 Abstract Syntax Tree, AST アセンブリ言語 Assembly Language

    機械語 Machine Language 人間が読める 計算機が読める コンパイラ 0 3 4 opcode operand 字句解析 構文解析 意味解析 etc. "3 + 4" 3 + 4 ADD 3,4 Programming Language
  17. 17 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3

    LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 人間が読める パーサ 仮想マシン Virtual Machine, VM インタプリタ 計算機が読める 3 + 4 "3 + 4"
  18. 18 "3 + 4" LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD プログラム

    バイトコード 仮想マシン バイトコード 仮想マシン 仮想的なコンピュータの動作をエミュレートするもの スタックマシンの形を取ることが多い 仮想マシンのためのアセンブリ言語 プログラムの中間表現
  19. 19 荷物置き場が一つだけあり ・一番上に積む(push) ・一番上から取り出す(pop) ことしかできないデータ構造 push pop 途中にデータを挿入する ことはできない 途中のデータを

    取り出すこともできない ※荷物は重いので一度に一つしか持てない
  20. 20 メモリとしてスタックを使う仮想マシン "3 + 4" LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD

    プログラム バイトコード スタックに3を積む スタックに4を積む スタックの上二つを足す スタックマシンでの動作
  21. 21 LOAD_CONST 3 3 push LOAD_CONST 4 4 push 3

    3 4 3 4 BINARY_ADD 3 4 pop 4 3 + = 7 7 push 7 3 4 pop
  22. 22 "3 + 4" LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD プログラム

    (中置記法) バイトコード 逆ポーランド記法 (後置記法) 3 4 + 演算子を、被演算子の後ろに置く記法
  23. 23 演算子でないものはスタックに積む (二項)演算子が来たら、スタックの上から二つ取り出し、演算結果を積む 逆ポーランド記法の読み方 3 4 + 3をスタックに積む 4をスタックに積む +

    スタックから二つ取り出して加算 LOAD_CONST 3 LOAD_CONST 4 BINARY_ADD スタックマシンのバイトコードは逆ポーランド記法で記述されている
  24. 24 a b * c + a * b +

    c 中置記法 逆ポーランド記法 a push b push a a b ab ab c push ab c a b ab c ab+c ab+c BINARY_MULTIPLY BINARY_ADD
  25. 25 a b c * + a + b *

    c 中置記法 逆ポーランド記法 a push b push a a b c push a b c b c a a bc a bc a+bc a+bc BINARY_MULTIPLY BINARY_ADD
  26. 26 なくて良い 別に ・Pythonではプログラムを抽象構文木に、さらに バイトコードに変換し、仮想マシン上で実行する ・バイトコードは仮想的なコンピュータのアセンブリ ・Pythonの仮想マシンはスタックマシン ・スタックマシンと逆ポーランド記法は相性が良い

  27. 27 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3

    LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 3 + 4 "3 + 4" ここを確認する
  28. 28 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3

    LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 3 + 4 "3 + 4" ここを確認する
  29. 29 スタックマシンで計算機を実装する プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST

    3 LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 仮想マシン Virtual Machine, VM 計算機が読める 3 + 4 "3 + 4" ここを作る
  30. 30 プログラム 抽象構文木 Abstract Syntax Tree, AST バイトコード LOAD_CONST 3

    LOAD_CONST 4 BINARY_ADD Byte Code Programming Language 仮想マシン Virtual Machine, VM 計算機が読める 3 + 4 "3 + 4" ここを作る 中置記法 逆ポーランド記法 3 + 4 3 4 + a + b x c a b c * +