AI.doll

このブログは僕のためのメモです。

PyTorchでGraph Neural Network

PyTorch Geometricの紹介

概要

M.DefferrardさんやT.Kipfさんによるグラフ信号処理を基にした、GCNなどのグラフを入力できるニューラルネットワークが数年前から注目されている。Chainerを使っている人であれば、Chainer Chemistryというフレームワークでこれらのモデルを構築できる。僕は基本的にPyTorchを使っているため、PyTorch Geometric という PyTorchの拡張ライブラリを使いはじめたので、これを用いてGNNモデルや食わせるデータの作り方を簡単にメモしておく。(基本的に公式のドキュメントの自分が使った部分だけを抜き出した感じ)

インストール方法

インストール方法は公式のInstallationを見れば分かるが、僕がインストールしたときのコマンドを一応ここにも書いておく。
PyTorchのバージョンは1.0.0以上が必要。
あとは以下のコマンドでインストールすれば使える。

pip install --verbose --no-cache-dir torch-scatter
pip install --verbose --no-cache-dir torch-sparse
pip install --verbose --no-cache-dir torch-cluster
pip install torch-geometric

使い方

Data

Dataクラスのオブジェクトを作るときの引数のうちよく使おうであろうものについて説明する。
x: グラフ上の信号のtensor (各ノードに対して定義された特徴量ベクトル)
edge_index : グラフ構造を示すtensorで[[始点のリスト], [終点のリスト]]になっている。( [[始点, 終点], [始点, 終点], ...]ではないので注意 )
edge_attr : エッジ上の特徴量 (辺の重みなど)、[[エッジ数], [特徴量ベクトルの次元]]の形
y : 教師信号などがある場合yとして持っておく

Dataset

まず, 抽象クラスとしてDatasetクラスと、InMemoryDatasetクラスがある。後者はデータが全部メモリに乗り切る場合に使われるクラスで、Datasetを継承している。
ここではDatasetクラスを用いたデータセットの作り方のみ説明する。
大まかなクラスの雛形は以下の通り。

class DatasetClass(Dataset):
    def __init__(self, root, transform=None, pre_transform=None):
        super(DatasetClass, self).__init__(root, transform, pre_transform)

    @property
    def raw_file_names(self):
        """ 元ファイル名のリストを作る """

    @property
    def processed_file_names(self):
        """加工済みファイル名のリストを作る"""

    def __len__(self):
        """データの数"""
        return len(self.processed_file_names)

    def _download(self):
        pass

    def process(self):
        """データの加工を行い保存する."""

    def get(self, idx):
        """idx番目のデータを取り出して返す"""

親クラスのinitを呼び出すことで定義される変数と、propertyとして呼び出せるものは以下の通り。 (データを保存しているディレクトリの最上位を'data/'とする)

変数名 内容
self.root initに渡したrootでデータディレクトリの最上位 ('data')
self.raw_dir rootの下のrawディレクトリへ ('data/raw')
self.processed_dir rootの下のprocessedディレクトリ('data/processed')
self.transform initに渡したtransform、データをgetするときに通す関数
self.pre_transform initに渡したpre_transform、データを保存する前に通す関数
self.raw_paths raw_file_namesの各要素の前にself.raw_dirをくっつけたもの(生データへのパス)
self.processed_paths processed_file_namesの各要素の前にself.processed_dirをくっつけたもの(加工して保存したデータへのパス)

_downloadの代わりにdownloadを定義して、self.raw_dirに保存する手順を書くこともできる. データが手許にある場合は上記のように_downloadをoverrideすれば良い。 ここで、保存するデータは前節で説明したDataオブジェクトを想定している。

定義済みのデータセット

ここに書いてあるものはimportすればすぐに使える。

実装されている手法

ChebConv(in_channels, out_channels, K, bias=True)
チェビシェフ多項式でグラフラプラシアンの累乗を効率よく計算するモデル。 in_channel: 入力するグラフのノード上の特徴量ベクトルの次元
out_channel: 出力するグラフのノード上の特徴量ベクトルの次元
K: グラフラプラシアンの何乗まで使うか。各ノードに対してKホップ以内のノードについて畳み込まれる。

GCNConv(in_channels, out_channels, improved=False, cached=False, bias=True)
ChebConvのK=1にしたほか、複数の近似等を含むもの。詳しくはKipfさんの論文を読むと分かる。

気が向いたらsurvey読みながら詳細に書くけどドキュメント読んだほうが正確で早いよ。

iPad Proを買い替えた

ノリで新しいiPad Proを買ってしまったよという記事

概要

ぼくはてんんさいなのでiPad ProをもっているのにあたらしいiPad Proをかってしまいました。
なんとなくで買い替えたくない人もいると思うので、比較・レビューします。
後から気付いたことがあったら追記します。

内容

アプリは変わらない

アプリは変わらないです。

Apple Pencil

ペンシルは当然Apple Pencil2を購入しました。ア○ルファ○クみたいな充電をしなくて良くなりました。
これはかなり大きくて、新しいペンだと横に貼り付けるだけで充電されるので、充電切れで書けないということがなくなりました。(古い方だと頻繁にあった)
充電しているときにスペースを取らなくなったのもかなり大きいです。

Face ID

これについてはTouch IDの方が(10↑↑↑↑↑10)倍良かったです。
僕はiPad Proで講義ノートをとったり、論文を読みながら式変形とかを書き込んだりすることが多いのですが、Face IDだと顔をにゅっとカメラに向けないといけないので机に平らに置いている状態だと面倒くさいです。ブラウジングしたり、ゲームするだけの💩野郎は不便じゃないと思いますが、僕のような用途で使う人は少し面倒だと思います。

キーボードについて

iPad Proでは今の所、英語しかDvorak配列に対応していないです。日本語だとQwertyという旧石器時代の配列を使わなければならないので、キーボード付きのケースを買う必要はないと思います。
まともな人間であれば、Ergodoxを使っていると思うので、古いiPad ProならLightning - USB 3カメラアダプタ で繋ぐと良いです。
注意してほしいのが、Lightning -> USBではなく、Lightning -> [USB + Lightning]のアダプタを買わないと、Ergodoxを使えない点です。(給電しながら使わないといけない)

その他

新しい方は軽いし、ベゼルが細いので同じ12.9 inchでも小さくてとても良いです。

おすすめのアプリ

ノートはNotabilityがおすすめです。
Good Notes5も縦スクロールに対応していますが、Notabilityの方がノートの区切りが気にならないので連続して書きやすいです。
(Good Notes5はあくまでノートという感じで、Notabilityは巻物って感じ?)
他は特に入れなくていいでしょう。

UbuntuでUnity3D

UbuntuでUnityが使いたい!

概要

Unity3Dを久々に触ろうと思ったけど、Macユーザーじゃなくなってしまったし、Windowsで開発するのは流石にあれなので、Ubuntuでやれないかなと思ってたらできた。 僕の環境はUbuntu 18.04だけど、16.04以降くらいならできそう。それより前のことは知らない。

やりかた

ここに、最新のインストーラへのリンクを貼ってくれているので、Official Installerと書いてあるやつをダウンロードする。後ろに行くほど新しい。

chmod +x [ダウンロードしたやつ]

で権限を与える。
Requirementsをインストールする。 例えば、

sudo apt install libgtk2.0-0 libsoup2.4-1 libarchive13 libpng16-16 libgconf-2-4 lib32stdc++6 libcanberra-gtk-module

インストーラを実行。

./[ダウンロードしたやつ]

全部終わったら、

[ダウンロードしたやつ]/Editor/Unity

を開けば始めれる。

参考

全部ここに載ってる: askubuntu.com

iPad Proでノートをとる

iPad ProのノートアプリはNotabilityがベスト?

目次

概要

僕は今までにたくさんのapple製品を買ってきました。 iPhone, iPod, iPad, iPad Pro, MacBook Pro, MacBookなどです。
そのなかで買って後悔していないのはiPad Proだけでした。
そこで, なぜiPad Proだけは買ってよかったのか考えてみるとノートをすべてこれでとることができるというのが大きいことに気づきました。 しかしiPad Proにはノートアプリがたくさんあります。
そして最近、どのアプリが一番いいのか悩むことが多くなってきたためこのブログで比較してみたいと思います。

各アプリに関するコメント

Notability

僕が一番長く使っているアプリです。昔は遅延が一番少ない気がしていたが最近はどのアプリも気にならないくらいに少なくなっている。

良い点

  • 無限縦スクロール(普通のノートみたいに横向きには進まず、縦にシームレスに書き進められる。一応ページ区切りはある)
  • 2つのノートを同時に見れる
  • 長押し?で直線がかける, 始点や終点がいい感じのところに吸い付く
  • ベクター消去 (一筆で書いた曲線はその曲線上のどの点を消してもすべて消える)
  • メモにロックがかけれて、Face ID/Touch IDで開ける

大きいサイズのテキストを入れると横線が微妙くなるのと、挿入した画像や図形の背景を透過できない (あと画像を回転できない) のが少し気になる。

Noteshelf2

(2018/11執筆時から見て)最近のアップデートで遅延がかなり少なくなったように感じました。このアップデートがなければどのノートにしようと悩むことはなかったと思います。

良い点

  • 図形ボタンを押すといい感じに丸とか直線がかける
  • ペンの種類が豊富, 色も自由に選択できる(色に関してはNotabilityも8.3から自由になった)

Nebo

アプリ自体のUIは気にならないがノートが可愛くない。

良い点

- 数式のテキスト化がいい感じ

GoodNotes

UIが可愛くない。ノートもいい感じにかけない。
何故か周りに使ってる人が時々いる。

良い点

  • あったら教えてください

比較

まぁ、NotabilityとNoteshelf2以外は僕的には実用できそうにないので, 2つの比較です。

Notability Noteshelf2
遅延
ページ移動
ペン種類
デザイン
その多機能

結果

ペンの種類が多くてノートが可愛くとれそうなのがNoteshelf2を使おうか迷ったところなのだけど、よく考えたら僕は種類が多いと選べないタイプなので、2種類しかないNotabilityを使おう。 新しく良さげなノートアプリを見つけたら追記していこうと思います。

機械学習の歴史

WikipediaTimeline of machine learningというページに機械学習の歴史がまとめられた表があったので、あとから見返しやすいように全て日本語にしてみた。
日本語訳はガバガバかもしれないので心配な人は元ページを見てね。
ムムッってとこがあったらコメントで教えてほしい

年表

1763 ベイズの定理のベース
トマス・ベイズ(Thomas Bayes)の著書, "An Essay towards solving a Problem in Doctorine of Chances"がベイズが死んだ2年後, 彼の友人により修正・編集され出版された.

1805 最小二乗
アドリアン=マリ・ルジャンドル(Adrien-Marie Legendre)が最小二乗(méthode des moindres carrés)について記述.

1812 ベイズの定理
ピエール=シモン・ラプラス(Pierre-Simon Laplace)がThéorie Analytique des Probabilitésを出版. その著書の中で, ベイズの研究を発展させ, ベイズの定理として知られる定理を示した.

1913 マルコフ連鎖
アンドレイ・マルコフ(Andrey Markov)が詩の分析に用いた手法について初めて記述する. この手法は現在マルコフ連鎖として知られているものである.

1950 Turing's Learning Machine(チューリングの学習機?)
アラン・チューリング(Alan Turing)が学習により人工的に知性を持つ, learning machine(学習機?)を提案する. チューリングの具体的な?提案は遺伝的アルゴリズムを予見した?.

1951 最初のニューラルネットワーク
マービン・ミンスキー(Marvin Minsky)とディーン・エドモンズ(Dean Edmonds)は最初のニューラルネットワークを作り, SNARCを学習させた.

1952 チェッカーを機械がプレイする
アーサー・サミュエル(Arthur Samuel)がIBMのポキプシー研究所の一員になり, 初めの機械学習プログラムに取り掛かり, チェッカーをプレイするプログラムを作成した.

1957 パーセプトロン
フランク・ローゼンブラット(Frank Rosenblatt)がコーネル航空技術研究所で働いている間にパーセプトロンを発明する. その発明はかなりの反響を呼び, メディアにより広く報道された.

1963 機械がTic-Tac-Toe(まるばつゲーム)をプレイする
ドナルド・ミッキー(Donald Michie)が強化学習(304個のマッチ箱とビーズで実装)によりまるばつゲームをプレイする機械を作った.

1967 最近傍
最近傍法が考案され, ベーシックなパターン認識の始まりとなった. このアルゴリズムは地図上での経路決定に用いられた.

1969 ニューラルネットワークの限界
マービン・ミンスキーシーモア・パパード(Seymour Papert)が共著書Perceptronを出版し, パーセプトロンニューラルネットワークの限界について述べた. この本が示したニューラルネットワークには根本的な限界があるという考えはニューラルネットワーク研究の障害であったと考えられている.

1970 自動微分(誤差逆伝播法)
セポ・リンナインマー(Seppo Linnainmaa)が個別に接続された入れ子状の微分可能関数のネットワークの自動微分の一般的な方法を発表する. これは現在の誤差逆伝播法と対応するが, まだそのように名付けられてはいなかった.

1972 TF-IDF
Karen Spärck Jonesがある単語が文書の集合中もしくはコーパス中でどの程度重要かを反映するための統計量TF-IDFを発表した. 電子書籍分野のテキストベースのリコメンダシステムは83%がTF-IDFを用いている.

1972 Stanford Cart
スタンフォード大学の学生が部屋を障害物を避けて案内するカート(小さな車?)を開発した.

1980 ネオコグニトロン
福島邦彦が人工ニューラルネットワークの一種である, ネオコグニトロンに関する研究を発表した. 後の畳込みニューラルネットワークはこれに着想を得ている.

1981 説明にもとづく学習
ジェラルド・デ・ヨング(Gerald DeJong)がデータを解析し, 従うことか出来て重要ではないデータを捨てられる一般的なルールを作る説明にもとづく学習を提案した.

1982 リカレント・ニューラルネットワーク
ジョン・ホップフィールド(John Hopfield)がリカレントニューラルネットワークの一種で, 連想メモリとして役立つ, ホップフィールドネットワークを広めた.

1985 NetTalk
テリー・セジノウスキー(Terry Sejnowski)が赤ちゃんと同じ方法で発音を学ぶプログラムを開発した.

1986 誤差逆伝播
デビッド・ラメルハート( David Rumelhart), ジェフリー・ヒントン(Geoff Hinton), ロナルド・J・ウィリアムス(Ronald J. Williams)が誤差逆伝播法のプロセスを説明した.

1989 強化学習
クリスト・ファーワトキンス(Christopher Watkins)がQ学習を開発したことにより, 強化学習の実用性がかなり上がった.

1989 PC上での機械学習の商業利用
Axcelis, Inc.がPC上で遺伝的アルゴリズムを商業利用した初めてのソフトウェアEvolverを発売.

1992 機械がバックギャモンをプレイする
ジェラルド・テザウロ(Gerald Tesauro)がTD学習を用いてバックギャモンをプレイする, TD-Gammonを開発. TD-Gammonは人間のトッププレイヤーには優らないか, 同程度の能力があった.

1995 ランダムフォレスト
ティン・カム・ホ(Tin Kam Ho)がランダムフォレストについて記述した論文を発表した.

1997 IBM Deep Blueがカスパロフに勝利
IBMのDeep Blueが当時のチェス世界チャンピオンに勝利した.

1997 LSTM
Sepp HochreiterとJürgen SchmidhuberがLong Short-TermMemory(LSTM)を用いたリカレントニューラルネットワークを発明し, リカレントニューラルネットワークの効率と実用性を大きく向上させた.

1998 MNIST データ
Yann LeCunのチームがアメリカ合衆国国勢調査局の局員とアメリカの高校生の手書き数字データセットである, MNISTデータベースを公開した. これ以降, MNISTデータは手書き文字認識のベンチマークとして使用される.

2002 機械学習ライブラリTorch
機械学習ライブラリであるTorchが初めて公開される.

2006 Netflix Prize
機械学習を用いて, Netflix独自のリコメンデーションソフトの精度をユーザーの映画に対する評価を予測する点において上回ることを目的とした, Netflix Prizeが開始する. この競争は2009年に決着した.

2009 ImageNet
データが現実世界を反映していないと機械学習アルゴリズムはうまく機能しない事に気づいたスタンフォード大学のFei-Fei Liにより考案された, 大規模画像データベースであるImageNetが作成された.ImageNetは21世紀のAIブームのきっかけとなった.

2010 Kaggleコンペティション
機械学習コンペティションのプラットフォームであるウェブサイトKaggleが立ち上げられる.

2011 ジョパディ!で人間に勝利
機械学習, 自然言語処理, 情報検索技術を組み合わせることでIBM Watsonがジョパディ!のチャンピオン2人に勝利した.

2012 YouTube上の猫を認識
アンドリュー・エン(Andrew Ng), ジェフ・ディーン(Jeff Dean)が率いるGoogle BrainチームがYouTube動画から抽出されたラベル付けされていない画像から学習により猫を認識したニューラルネットワークを作成した.

2014 顔認識における飛躍
Facebookの研究者がニューラルネットワークを用い, 97.35%の精度で顔を識別するシステムであるDeepFaceに関する研究を発表した. 97.35%というのはそれ以前のモデルと比べ, 27%以上の改善であり, 人間にも匹敵する精度だった.

2014 Sibyl
Googleの研究者がユーザー行動の予測とリコメンデーションの提供のためにGoogleで使われていた大規模並列機械学習のためのプロプライエタリなプラットフォームであるSibylに関する研究の詳細を述べた.

2016 囲碁で人間に勝利
GoogleのAlphaGoは機械学習と木探索を組み合わせて, ハンデ無しの人間のプロプレイヤーに勝利した初めてのコンピュータ囲碁プログラムとなった. 後にAlphaGo Zeroとして改良され, 2017年にAlphaZeroとしてチェス等の二人ゲームに一般化された.


参考文献とかはWikipediaの方を見てね(消えてたらあれだけど)