Hatena::ブログ(Diary)

糞ネット弁慶

日本声優統計学会/声優統計についてはこちら

2017-12-22

[] NIMA: Neural Image Assessment (Arxiv) または『Googleが作った画像評価モデル』の元論文を読んだ 20:57  NIMA: Neural Image Assessment (Arxiv) または『Googleが作った画像評価モデル』の元論文を読んだを含むブックマーク

[1709.05424] NIMA: Neural Image Assessment

Google、任意の画像が技術的に審美的に美しいかを評価し1-10(10が最高得点)で採点するCNNベースの画像評価モデル「NIMA」を提案した論文を発表 | Seamless

Research Blog: Introducing NIMA: Neural Image Assessment

「写真を評価する人工知能」と話題になっていて,そんな研究いくらでもあるだろうと思ったので元論文を読んだ.

例えば似た話にニコニコ静画(イラスト)に投稿された175万枚の画像を用いて、閲覧数とお気に入り数を予測する回帰の問題としてchainerを用いて学習させた話とかある.

概要

画像を評価するニューラルネットを提案する.

前述の記事では「技術面と審美面」となっているけれど記事だけじゃ何が書いてあるのかまったく意味不明であり,画像処理にも詳しくないので intro を少し真面目に読む.

まず技術面 (technical quality) というのは技術というより品質の評価.画像がどの程度劣化しているかというのを評価するタスク.劣化前の画像がある場合と無い場合があって,劣化前の画像があるのなら PSNRSSIM といった指標を用いることで劣化度合いが計算できる.が,劣化前画像が無いことが多いので「元の画像からどれだけ劣化したか」を予測する必要がある.

次に審美面 (aesthetic quality) はそのまま人間による評価.美しいか,独創的か,など.

タスクにおいて用いる学習用データには,人手での評価が行われている.評価は 1 から 10 の 10 段階のように,段階で評価が行われているものとする.

既存手法では,評価の平均値に対する回帰や,高評価/低評価の分類を行なうものが多いため,評価の分布の情報を活かすことができていない.そのため,モデルによる評価が人間の評価と相関がそこまで高くなかった (言及している既存研究 ([1606.01621] Photo Aesthetics Ranking Network with Attributes and Content Adaptation) を見てもそこまで低くは見えないけれど).

NIMA では人間の評価により近付けるため,評価の分布そのものをヒストグラムとして扱って予測する.これにより, technical および aesthetic 両方において人間の評価と非常に相関が高い出力を得ることができた.

データセット

画像の美しさの評価はAVA: A large-scale database for aesthetic visual analysis - IEEE Conference Publicationを用いる.このデータセットでは画像ごとに 10 段階の評価が行われている.

画像の品質に関する評価はNikolay Ponomarenko homepage - TID2013を用いる.こちらも 10 段階の評価が行われている.評価データの作り方はちょっと工夫がされているので原文参照.

手法

画像から特徴量を抽出するネットワークは VGG16 や Inception-v2 といった既存のものを用いる.その上で,最終層を取り除き, full connected -> softmax で N 段階評価の N 個の多項分布を出力する.イメージとしては,各評価値 (bucket) に落ちる確率,と論文では表現されている.

しかしこの確率をただ学習する (例えば損失関数を cross entropy にする) のでは,評価値ごとの順序性が考慮されない.

「ならば回帰で解けばいいじゃないか」と思われるかもしれないが,しかし,分類ベースで解く方がいいと過去の研究でも言われている.

NIMA では損失関数を Earth Mover's Distance (EMD) にすることで順序付きの分類を適切に解く.

実験結果

前述のデータセットに対して予測実験を行っている.

この論文で一番よくわかっていないのは実験結果の見方で,人間の評価と相関が高いほど良いという話はわかっているのだけれど,そもそも比較しているほとんどの既存手法では相関が計算されていない.

なのでこの手法の良し悪しをどう評価しているのかが正直わからない.

Google Research Blog で取り上げられるほど優れた何かがあるのか,画像処理に詳しくないのでわからないままだった.詳しい人に聞きたい.

[] 冬のコミックマーケット2日目,30日東 F-55b にて「声優統計5, 6, 7, 8号」の在庫を頒布します 21:05  冬のコミックマーケット2日目,30日東 F-55b にて「声優統計5, 6, 7, 8号」の在庫を頒布しますを含むブックマーク

終わったはずの声優統計.しかし5号から8号までの前回の冬コミ在庫が若干部屋に残っていました.正直保存状態は悪いです.

@MagnesiumRibbonが30日東 F-55b Rei'n forcement にて松嵜麗さんの本を出す予定(松嵜麗さんのファンブックを出したいです - Rei’n forcement)ですが,そこで在庫の残りを頒布します.今度こそ終わりです.

各号の内容は日本声優統計学会をご確認ください.

トラックバック - http://d.hatena.ne.jp/repose/20171222

2017-12-03

[] Deep Text Classification Can be Fooled (Preprint) 読んだ 16:35  Deep Text Classification Can be Fooled (Preprint) 読んだを含むブックマーク

Deep Text Classification Can be Fooled

入力を少し変化させるだけで機械学習によるモデルの推定結果を変えてしまう技術は Adversarial example と呼ばれている.

よく見るのは画像を用いた例だけど,それが文書分類でもできないかと思い探したところ,まずこれがでてきたので読む.

画像一般についてはこちらが詳しい.これを読むまで Deep Learning 特有の問題と思っていたが,実際はそうではないらしい.

no title

前提

文書 を入力として,その文書のクラス を推定するモデル があるとする.

そこで, に手を加えた によってモデルの出力を任意のクラス に誤分類 させたい.

画像と違うのは,入力が文書であるため,人間の目で見ても不自然でないように変更しなければならないということ.

手法

基本的には Explaining and Harnessing Adversarial Examples (FGSM) で提案されているように,コスト関数の勾配を用いる.

分類モデル Character-level Convolutional Networks for Text Classification で提案されている Character-level CNN

文書の変更は挿入,修正,削除の3つの方法を適用する.それぞれ説明する.

挿入

各学習データ と目的のクラス および損失関数 に対して,勾配 を計算することで,各次元,つまりは各単語に対して勾配が得られる.

各学習データにおいてこの勾配が大きい単語上位100件を得,それを全学習データで数え上げることで, Hot Training Phrases (HTPs) を得る.

あとは HTP を挿入していくだけで誤分類できる.例えば Company 99.7% と予測していた文書に historic という単語を加えるだけで Building 88.6% と誤分類させることに成功している.

挿入位置も重要で,適当なところに入れると出力が変化しない.元クラスに強く寄与している,つまり が大きい単語の近くに挿入することで適切に誤分類できる.

複数の単語を挿入しなければいけない場合は HTP が含まれた文章を新たに追加する.もしちょうどいいものがなければ,読み手にばれにくい嘘の文章を追加する.

修正

修正といっても削除に近い.

元クラスに寄与している語を を使って探す.これを Hot Sample Phrase (HSP) と呼ぶ.

HSP に対して,元クラスへの損失関数 を増加させつつ,目的のクラスへの損失関数 を減少させるような修正を行なう.

単語の修正とは一体何かというと,

  • ミススペルさせる (ミススペルコーパスを事前に用意しておく)
  • 人間に見分けがつきにくいような置換を行なう.例えば l と 1 (おそらく置換ルールを用意しておく)

という二種類を行なう.

例えば comedy film property が HSP (Film, 99.9%) だった場合,flim と typo することで Company 99.0% にできる例が示されている.

削除

HSP が高い単語を削除するが,無闇に削除すると人間にばれる.よって形容詞副詞を削除する.

論文中では seven-part British terevision series という HSP に対して British を削除することで Film 95.5% を 60.5% まで低下させている.

組み合わせる

これら三つを組み合わせることで飛躍的にうまくいく.

実験

例が作れたかどうかだけではなく,人間に読ませる実験も行っている.

変更を加えた文章も人間は適切に分類しており,うまく のみを騙せていることがわかった.

また,「人為的に変更した箇所と思われる部分を指摘せよ」という指示も出したが,精度 5.0%, 再現率 2.0% だったのでかなりばれにくいことがわかった.

シンプルだけどとてもおもしろかった.日本語でやるとすると見た目が似た漢字などが使えるのかもしれない.

日本語の多クラス分類データセットがあればすぐにでも実験できそう.

また, Adversarial example 自体は CNN 固有の問題でないので, GBDT などでも再現できるのではないだろうか.

(追記) 寝て起きて気づいたけれど,「挿入位置にセンシティブである」ということから bag-of-words で表現するモデルでは正しく動作しない気がしてきた.

トラックバック - http://d.hatena.ne.jp/repose/20171203

2017-11-13

[] IBIS 2017 行った 20:08  IBIS 2017 行ったを含むブックマーク

IBIS2017 | 第20回情報論的学習理論ワークショップ, 2017.11.8〜11, 東京大学 本郷キャンパス

聞いたポスターについてメモ.人があまりに多くて,予定していた半分も聞くことができなかった.

  • D1-22 : 機械学習モデルの列挙
    • 著者らによるスライド 機械学習モデルの列挙
    • 同じ精度を持ちつつ,異なるモデルを複数列挙することでユーザが納得のいくモデルを見つけることができる,という話
    • Enumerate Lasso の論文は読んでいたけれど,特殊な形の決定木であっても列挙は可能である,という話をもう少し詳しく聞きたかった
  • D1-25 : HTTP通信を用いた半教師あり学習によるマルウェア感染端末の分類器について
    • 教師あり学習で判別したいが特徴量が非常にスパース.そこで半教師ありでデータを追加すると精度が改善する
    • とはいえ追加せずとも AUC が 0.8 近かった
  • D1-38 : 自己回帰テンソル分解による時空間予測
    • 例えば,離散時刻ごとに各メッシュ(空間を等間隔で区切ったものとするが,本質的にはユニークな位置でも構わない)に人が何人いるか,というデータが存在しているとする.もっとも難しいのは,未来の時刻に未知のメッシュの人数を予測するという,時空間的な外挿問題である.
    • テンソル分解で予測を行うが,時間方向には AR モデルを想定し,空間方向には「予測対象である位置と,その近傍位置との角度に対するトレンド」という構造を持ち込む.
      • どういうことかというと,予測対象点と周囲の点にどういう流れが存在しているかという関係.例えば角度を4等分すれば90度ごとのトレンドがある.言葉では説明しづらいけれど図を書けばすぐに伝わるはず.
      • 角度という単位に落とすのでそこまでスパースではない
      • とはいえ空間の絶対位置で方向トレンドが変化しないのでそれは future work らしい
    • Temporal Regularized Matrix Factorization for High-dimensional Time Series Predictionの発展系.
  • D1-41 : IILasso:相関情報を罰則項に導入したスパースモデリング
  • D1-48 : 関係データに向けた混合エキスパートモデル
    • それぞれのユーザについて,購買データ(何を買ったか)と属性データ(年齢や性別など)の両方が存在している時に,属性データの一部が欠損しているので予測したい
    • 購買データを特徴量にして属性を予測するには特徴量の加工などが必要
    • そこで,「購買データを元にユーザをクラスタリングする」「クラスタごとに属性を予測するモデルを構築する」の二つを同時(交互)に最適化することで,精度良く予測できるクラスタ構造を推定する
    • クラスタリングIRM で予測は Structured SVM でやると目的関数が 2 モデルを結合した生成モデル的に書けて便利
    • クラスタリング結果の解釈は難しかったらしい
    • Relational Mixture of Experts: Explainable Demographics Prediction with Behavioral Data (ICDM 2017) で論文になっているらしい
  • D1-50 : 学習可能なマスクを用いた柔軟な類似度計算手法
    • DNNで特徴抽出する属性別の類似画像検索を実現したいが,属性別にモデルを作るのはコストが高い
    • 既存研究 (論文忘れた) では最終層一つ前に Mask と呼ばれる層を属性別にベクトルとして導入して,「今はどの属性で類似検索を行っているのか」を学習させることで,特徴量抽出部分を使いまわせたり,恐らく学習済みモデルをそのまま適用することが可能
    • それを複数属性での検索に拡張しようという話
    • 単一マスクでの検索と複数マスクでの検索の関係がわかりにくかった
  • D1-54 : Web小説を学習に用いた二段階LSTMによる台本形式小説生成
    • 「キャラクター名『台詞』」の連続で構成される Web 小説 (題材はアイマス SS) を学習する LSTM
    • ネットワーク名が TULIP なのに「キャラクターには詳しくないのですが」と言っていた
    • 出力は一見それらしかったが,評価がうまくいってないかもしれないらしい
    • キャラクターの埋め込み結果とか見たかった
  • D2-4 : Delayed Feedback を考慮した予測モデルの提案
  • D2-23 : ブランドコンセプトを反映したファッションアイテム類似検索
    • ファッションアイテム類似検索にブランドコンセプトを反映する
    • IQON のデータではユーザがアイテムに like をつけた時系列情報があるのでそれを元にブランドごとの embedding を学習する,があまり効かなかったらしい
  • D2-36 : 観測が制限されたオンラインスパース線形回帰問題に対する効率的アルゴリズム
    • オンライン学習で,かつ,説明変数の一部を選んで予測および学習ができるという状況でどう効率的に特徴量を選べばいいかという問題
    • 「例えば,未知の病気に対してすべての検査を実施するのではなく,そのうち一部だけを実施するという状況です」という説明がとてもわかりやすかった
    • Efficient Sublinear-Regret Algorithms for Online Sparse Linear Regression with Limited Observation (NIPS 2017) らしい
  • D2-46 : カーネル法に基づく共起尺度

渡辺澄夫先生の「学習理論よ何処へ」も聞いた.「人間力・構想力・コミュニケーション力ばかりが求められて」云々,という話から始まり,会場は大盛り上がりなのだけれど,どのような人間力・構想力・コミュニケーション力ばかりが重視されているのか,一体何を・誰を・どのような現象を敵と見据えての話なのかがわからないままで,居心地が悪かった.幸いなことに中盤以降は学習理論の話になって良かった.

話が飲み込めなかった理由は,自分が職業研究者ではなく,また,会場に集まった皆さんのように研究能力や知能が高くないからなのだと思う.みんなみたいに優れた知性を持った研究者になりたかった.

トラックバック - http://d.hatena.ne.jp/repose/20171113

2017-08-19

[] Neural Collaborative Filtering (WWW 2017) 読んだ & Chainer で実装した 19:05  Neural Collaborative Filtering (WWW 2017) 読んだ & Chainer で実装したを含むブックマーク

Neural Collaborative Filtering (pdf)

概要

タスクは user と item について評価しているか (1) していないか (0) の情報 (implicit feedback) から未知の user と item の評価を予測する,商品推薦において非常に古典的なもの.

一般的には協調フィルタリングや行列分解を行なうが,この論文では Neural Collaborative Filtering (NCF) を提案している.

手法

人の user と 個の item について,評価/購入しているかしていないかのデータ が与えられているとする.

NCF ではこの を行列分解と多層パーセプトロンの二つを同時に推定することで学習する.

行列分解

入力である の行列を となるように 次元の行列 に分解する.

多層パーセプトロン

それぞれを one-hot encoding したものを連結して多層パーセプトロンで学習.

NCF

行列分解と多層パーセプトロンとを同時に学習する.わかりやすく各処理での次元数を書く.

  • user と item をそれぞれ one-hot encoding したものを連結した M+N 次元のベクトルを作る
  • この入力をもとに M+N -> d_1 -> d_2 -> ... -> d_i 次元まで落とす i 層のニューラルネットを作る
  • 同時に, user と item を それぞれ K 次元に embedding し,要素ごとの積である K 次元のベクトルを作る.これが行列分解に相当する
  • d_i 次元のニューラルネット由来のベクトルと K 次元の行列分解由来のベクトルを連結し d_i + K 次元のベクトルとする
  • 最後に sigmoid に通して予測値 とする

Chainer による実装

はじめてまともに Chainer を書いた.簡単でいい.

とりあえずは二層で,宣言時にユーザ数,アイテム数,行列分解の次元数,ニューラルネットの層の数を指定する.

学習時には user と item ,それらを one-hot encoding したベクトル user_vec/item_vec ,およびラベルを与える.

movielens で実験したところ,素の行列分解よりは精度が高そうな感じがした. ensemble に近い内容だからではないのという気持ちも少しある.

import numpy as np

import chainer
from chainer import functions as F
from chainer import links as L
from chainer import Variable

class NCF(chainer.Chain):
    def __init__(self, n_user, n_item, n_mf_dim, n_dim_1, n_dim_2):
        self.n_user = n_user
        self.n_item = n_item
        self.n_mf_dim = n_mf_dim
        self.n_dim_1 = n_dim_1
        self.n_dim_2 = n_dim_2

        self._layers = {
            'MFQ': L.EmbedID(self.n_user, self.n_mf_dim),
            'MFP': L.EmbedID(self.n_item, self.n_mf_dim),
            'l1': L.Linear(self.n_user + self.n_item, self.n_dim_1),
            'l2': L.Linear(self.n_dim_1, self.n_dim_2),
            'l_out': L.Linear(self.n_dim_2 + self.n_mf_dim, 1)
        }

        super(NCF, self).__init__(**self._layers)

        for param in self.params():
            param.data[...] = np.random.uniform(-0.1, 0.1, param.data.shape)


    def predict(self, u, i, user_vec, item_vec):
        # train neural net
        input_vec = F.concat((user_vec, item_vec), axis = 1)
        h = F.relu(self.l1(input_vec))
        h = F.relu(self.l2(h))

        # matrix factorization
        mf_p_u = self.MFQ(u)
        mf_q_i = self.MFP(i)

        # concat matrix factorization
        h = F.concat((h, mf_p_u * mf_q_i), axis = 1)
        h = self.l_out(h)
        return F.sigmoid(h)


    def __call__(self, u, i, user_vec, item_vec, y):
        pred = self.predict(u, i, user_vec, item_vec)
        loss = F.sigmoid_cross_entropy(pred, y.reshape(len(y), 1))
        chainer.report({'loss': loss}, self)
        return loss
トラックバック - http://d.hatena.ne.jp/repose/20170819

2017-08-01

[] Face-to-BMI: Using Computer Vision to Infer Body Mass Index on Social Media (ICWSM 2017) 読んだ 14:24  Face-to-BMI: Using Computer Vision to Infer Body Mass Index on Social Media (ICWSM 2017) 読んだを含むブックマーク

Face-to-BMI

顔写真から BMI (Body Mass Index) を推定する.

データセットは progresspics - Show us your body transformations をクロールし,皆さんがアップロードしている before / after の写真 4206 枚を集めた. reddit にこんなデータがあるとは思わなかった.

手法は VGG-Net と VGG-Face それぞれで特徴量抽出し,Support Vector Regression で回帰.

実験結果を見るかぎり,女性より男性の方が推定しやすいのは面白い.

トラックバック - http://d.hatena.ne.jp/repose/20170801

2017-07-08

[] 「声優統計コーパス : 二次配布可能な音素バランス文とその読み上げ音声の構築」を書いた 17:17  「声優統計コーパス : 二次配布可能な音素バランス文とその読み上げ音声の構築」を書いたを含むブックマーク

声優統計コーパス : 二次配布可能な音素バランス文とその読み上げ音声の構築 (pdf, GitHub)

というわけで

プロの女性声優 3 名が 3 パターンの感情表現で読み上げた音声 2 時間分 を「声優統計コーパス」として無料公開します - 糞ネット弁慶

で公開した声優統計コーパスについて,その作り方,特に音素バランス文の選択について書いた.

やっていることは単純だけど細かい話などがあるので,音素バランス文や音声コーパスを作りたい人の手助けになればいいと思う.

今回はカバーすべきダイフォンの最低登場回数しか考慮していないが,分布そのものを近付ける必要があるのかないのか,理想的なダイフォンの分布があるのか,より読み上げに適した文章や単語を選ぶ必要があるのか,といった話はよくわかっていない.

きっと音声処理を行なう研究室や企業にさまざまなノウハウがあるのだと思う.

[] golangBPR な Factorization Machines を書いた 17:30  golang で BPR な Factorization Machines を書いたを含むブックマーク

python で実装はしていたけれどもう少し速度が欲しかった.

C++で書こうと思っていたけれど,周りから golang を薦められたので従った.

高速化のためにパラメータ更新は[1106.5730] HOGWILD!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descentにあるような衝突しても構わない形での SGD を使っている.

golang,はじめて書いたけれど型があると気分がいい.go-flymake で書いている最中に何が間違っているかすぐにわかるのもいい.

トラックバック - http://d.hatena.ne.jp/repose/20170708