PyCon JP 2019 参加メモ

# 概要

[PyCon JP 2019](https://pycon.jp/2019/)


# 発表内容

自分が聴講したもの中の一部を公開します。
アップロード禁止の発表については除いています。

各発表は、[資料一覧](https://pyconjp.connpass.com/event/135734/presentation/)と[動画アーカイブ](https://www.youtube.com/user/PyConJP/videos)が公開されているので、興味がある場合は是非こちらをご覧ください。


## [PythonとAutoML](https://www.slideshare.net/c-bata/pythonautoml-at-pyconjp-2019)

### メモ

- AutoMLの要素技術
    - ハイパーパラメータ最適化 / 特徴量エンジニアリング / アルゴリズム選択

- ハイパーパラメータ最適化
    - より少ない試行回数でより良いハイパーパラメータにたどり着きたい
    - ベイズ最適化や早期打ち切りで効率よく探索

    - Optuna
        - TPEによるベイズ最適化、Successive Halvingによる早期打ち切り
        - Define-by-Runによる柔軟な目的関数の記述

    - scikit-optimize
        - GPベースのベイズ最適化
        - 実装でシンプルなscikit-learnのGaussianProcessRegressorを使用されており分かり易い

- 特徴量エンジニアリング
    - 現状のAutoMLライブラリでは、スケーリングや欠損値補完、エンコーディングなど基本的なものにのみ対応
    - 特徴量生成
        - featuretools
            - リレーショナルデータの関係性を基に特徴量を作成するDeep Feature Synthesis(DFS)アルゴリズム
        - tsfresh
            - 時系列データに特化した特徴量生成・選択ライブラリ
    - 特徴量選択
        - 予測性能の向上(過学習の抑止)、高速化、解釈性の向上が目的
        - フィルター法、ラッパー法、組み込み法それぞれscikit-learnのfeature_selectionやBorutaが対応

- アルゴリズム選択
    - すべてのデータに最適なMLモデルは存在せず、一部のモデルの性能はパラメータセンシティブである
    - アルゴリズム選択は、ハイパーパラメータ最適化と同時に扱う必要がある
    - auto-sklearn
        - scikit-learnのモデルを扱うライブラリ
        - SMAC3を用いたベイズ最適化によるアルゴリズム選択
    - TPOT
        - scikit-learnのモデルを扱うライブラリ
        - 遺伝的アルゴリズムを用いたアルゴリズム選択

### 所感

AutoMLの現状のレベルがどの程度なのかが分かる発表でした。

将来的にはMLエンジニアの業務を代替する技術になると思っているのですが、やはり経験知を活かすような特徴量設計は特にまだまだだという印象を受けました。


## [機械学習におけるハイパーパラメータ最適化の理論と実践](https://speakerdeck.com/nmasahiro/ji-jie-xue-xi-niokeru-haihaharametazui-shi-hua-falseli-lun-toshi-jian)

### メモ

- ハイパーパラメータ最適化
    - Black-Box最適化
    - Gray-Box最適化

- Black-Box最適化
    - 関数情報が不明なため、勾配情報などが使えない
    - 1度の評価に時間がかかるため、少ない回数でよい解を探索したい
    - ベイズ最適化とCMA-ES

- ベイズ最適化
    - GP-EI
        - ガウス過程(GP)によって目的関数をモデル化し、評価値の改善期待値(EI)が最大になる点を選択していく
        - 目的関数がGPに従うとおくことで、解析的にEIを導出可能
        - しかし、一般に目的関数は多峰関数のため、最適化は容易でない
    - TPE
        - GP-EIと目的関数のモデル化の仕方が異なる
        - 探索結果から評価値が上位になる空間を推測し、探索していく
    - GP-EIとTPEの違い
        - カテゴリカル変数の取り扱い
            - TPEは直接扱えるが、GP-EIはエンコーディングが必要
        - 次元数
            - 低次元の時はGP-EI、高次元の場合TPE
            - GP-EIは探索空間を全てモデリングするが、TPEは有望な空間を効率よく探索

- CMA-ES
    - 評価値を予測する多変量正規分布から解を生成することで探索を行う
    - 探索を行いながら、評価値を重みとして正規分布パラメータを更新していく

- ベイズ最適化とCMA-ES
    - GP-EIは探索空間全体を扱うため効率が悪い
    - CMA-ESは、計算量がiteration数に依存しないため、評価数が膨大にある場合、CMA-ESの方がよい
    - ノーフリーランチ定理より、一概に良い最適化手法を挙げるのは難しい

- Gray-box最適化
    - 関数の性質を利用して、最適化する

- Successive Halving
    - 経験上、中間の評価値は最終評価値と相関があるため、学習途中の評価値を基に、解の候補を絞り込む
    - 一方、学習率などの選び方により、序盤の評価値の相対関係と最終評価値が必ずしも連動しない場合がある
- Hyperband
    - 学習ステップの打ち切り方を変えるSuccessive Halving
- BOHB
    - ベイズ最適化(BO)とHyperband(HB)を組み合わせ

- Population Based Training(PBT)
    - 一定ステップまで並列でモデルを学習した後、最良モデルを複製
    - ハイパーパラメータを少し変えて再度探索


- マルチタスクベイズ最適化(MTBO)
    - 似た問題/データが存在する時に効率よく最適化
        - 週1単位でチューニングする機械学習サービス
        - 先週と大きく傾向は変わらない
    - タスク間の関係性をガウス過程によりモデリング

- Q&A
    - ハイパーパラメータ最適化手法のパラメータについて
    - ライブラリ上の設定は、実験的に検証されている or クリティカルなものではないので、実用上気にしなくても問題ない

### 所感

ベイズ最適化についてしか知らなかったため、様々な手法を知ることが出来良かったです。
特に、よりビッグデータにスケールしやすいCMA-ESを知れたのは大きく、是非使いたいと思います。

発表中にノーフリーランチの定理の話が出たのが印象的です。全ての問題に対応できる万能な手法はない、ということですが、改めてこの最適化問題の難しさを確認するいい機会になりました。

## [Pythonで始めてみよう関数型プログラミング](https://speakerdeck.com/meganehouser/pythondeshi-metemiyouguan-shu-xing-puroguramingu-058b9e1e-22f1-4f5e-80ba-4563f965140e)

### メモ

- 関数型プログラミングとは
    - 複数の式を関数の適用により組み合わせるプログラミングスタイル
        - 手続き型：命令実行の列を記述する
    - データが独自に定義する機能や関数を組み合わせた関数を作る機能をもつ

- Pythonで関数型プログラミングをする方法
    1. 標準機能・パッケージで実現
        - [関数型プログラミング HOWTO — Python 3.7.4 ドキュメント](https://docs.python.org/ja/3/howto/functional.html)
    1. Pythonにコンパイルできる言語を活用
    1. コンパイル時に抽象構文木(AST)変換を行う
    1. 3rdパーティパッケージを活用（以下の紹介）

- 関数型プログラミングの機能と対応するパッケージ
    - 関数合成
        - 2個の関数を合成して、1つの関数を作り出す
        - 処理する順序で関数を並べて定義できるので、可読性が高い
        - fn.pyパッケージのFクラス
            - pythonは演算子を新たに定義することが出来ないので、クラスの特殊メソッドのオーバーロードを利用
            - \_\_rshift__を裏書きし、>>演算子を作成
    - 関数のカリー化・部分適応
        - カリー化
            - 複数引数の関数を1引数の関数を組み合わせた合成関数にすること
        - 部分適応
            - 複数の引数をとる関数に対して、一部の引数を適応し、残りの引数をとる関数にすること
        - 引数を減らす→lambda式を減らすことが出来る
        - fn.pyパッケージのcurriedデコレータ
            - functool.particalを使って引数を部分適用している

    - 不変・永続データ構造
        - 一度定義された値が変更されないこと
        - 関数の参照透過性につながる
            - ある式に対して、その式をその式の評価値に置き換えても、プログラムの振る舞いが変わらないこと
            - 特に、値を返す以外に副作用のない参照透過な関数を純粋関数と呼ぶ、
        - pythonの関数が参照渡しなので、引数で渡したオブジェクトは関数内の操作による影響を受ける可能性がある

        - pyrsistent
            - python標準オブジェクトの不変、永続化なデータ型を提供
            - データ操作時に新しくオブジェクトを返すように実装

    - パターンマッチ
        - 構造を持つデータを分解し、その構造や取り出したデータにより条件分岐を行う
        - ifやtryによる実装では、データの構造が分かりにくい
        - Pampy

    - モナド
        - 文脈を持った値に対して、文脈を持たない場合を定義できる型クラス
            - ?
        - typesafe-monad
            - Maybeモナド：値が存在する|存在しない文脈をもつを実装できる

### 所感

関数型言語の知識はほとんどなかったのですが、これを使ってできそうなことが色々分かりました。

機能についての説明が、表面的なことだけでなく、実装を交えたユースケースも多かったので、非常に参考になりました。

業務で書いてるMLシステムのプログラムの一部を治すのに使えそうだなと思っています。
勿論、他メンバーの習得などもあるので、現実的には簡単に行えることではないですが。。。


## [メディアが運用すべき持続可能なVTuberをつくる技術](https://speakerdeck.com/hirosaji/medeiagayun-yong-subekichi-sok-ke-neng-navtuberwotukuruji-shu)


### メモ

- VTuberの種類
    - 自動生成型
        - テキストデータから自動生成
        - テキストデータを前処理(書き言葉→話し言葉、要約)した後、音声データ + モーションデータを生成し、映像化
        - Amazon Sumerianで簡単に実装できる
    - 多重人格型
        - どんな中の人でも同一のキャラとして振る舞う形式
        - モーションキャプチャーと声質変換を行う

- 声質変換について
    - 音声情報の分析・変換・合成
    - 音声変換には、音響特徴量を抽出する
        - 声の高さ(周波数)
        - メルケプストラム：周波数スペクトルに対して、人間の聴覚特性で重要な低周波領域で表現する低次元情報
        - 声のかすれ（非周期性）
    - 中でも、音声変換では、メルケプストラムが重要

    - 声質変換モデル
        - 機械学習モデルにおいては、メルケプストラムのみを扱うことが多い

### 所感

最近、VTuberの配信を見ているので、PyConJPの中でも興味がある発表でした。

短い発表時間でしたが、とても分かり易い発表だったので、おおよその技術要素をつかむことが出来た。

特に、音声情報についてはほとんど知らず、メルケプストラムというものは初耳だったので勉強になったので、触ってみたいと思う反面、
質疑の中では実用レベルにもっていくのはなかなか難しいという話もあり、難しさを想像させるお話しでした。