学習記録

日々の学習メモを残すためのブログ。雑多メモ多め。時々日常のこと。

論文メモ - Matrix- and tensor-based recommender systems for the discovery of currently unknown inorganic compounds

https://arxiv.org/pdf/1710.00659.pdf
(2017年9月)

(以下自分の解釈メモ)

概要

機械学習を用いて、未発見のChemically relevant components (CRCs)の候補を、非負値行列因子分解(NMF)・特異値分解(SVD)・CP分解・Thucker分解をベースとしたレコメンドシステムで探索する論文。

候補CRCに対して、密度汎関数理論(DFT)を用いて安定性の評価を行っている。

背景

膨大な元素の組み合わせの物質を網羅的にDFTで計算するのは計算コストがかかる。
⇒ 既存データから機械学習で候補を見つけられればコスト削減

データセット

  • ICSD
  • Powder Difraction File (PDF)
  • SpringerMaterials(SpMat)

上記3つのデータベースから無機結晶構造のデータを使用。

$A_aB_bX_x$の三元化合物を対象。 (A、Bは陽イオン(66個)。Xは陰イオン(10個))

$max(a,b,x)≤8$

全組み合わせとしては$662×10×170=7,405,200$個の化合物

3元化合物に加え、4元・5元も作成。

Matrix-basedレコメンドシステム

  1. {$A$} and {$B, X, (a,b,x)$}
  2. {$A, X$} and {$B, (a, b, x)$}
  3. {$A, B$} and {$X, (a, b, x)$}

上記各データセットを評価マトリックスの行・列に対応させる。

現在発見されている化合物の箇所だけ1、未発見/存在しない化合物の箇所は0で埋める。

(FIG.3参照)

NMF、SVDで評価。

(FIG.4参照)

Tensor-basedレコメンドシステム

{$A$}、{$B$}、{$a,b,x$}を評価テンソルの三軸に対応させる。

(FIG.5参照)

CP分解・Thucker分解で評価。

(FIG.6参照)

評価

高評価順ならべたトップ27に対しDFTで安定性評価。
⇒ ほとんど(85%)が安定

トップ27と元素の組み合わせ{$A,B,X$}は同じだが、{$a,b,x$}が異なる低評価化合物に対してもDFTで安定性評価。
⇒ ほとんど(86%)が不安定

(TABLE Ⅲ参照)

Conclusion

Thucker分解が一番良い発見率。

機械学習によるレコメンドとDFT安定性評価はほぼ一致する結果。
 ⇒ 新CRC発見において機械学習は有用な手法

量子アニーリングシミュレーション (苦戦中)

Web情報を参考に量子アニーリングを実装して検証を行ってみたが、うまくいかない・・・

ソース

ベースクラス

import numpy as np
import matplotlib.pyplot as plt

class System():
    def __init__(self, temperature, kb=1):
        self._temperature = temperature
        self._kb = kb

    # 温度の設定
    def set_temperature(self, temperature):
        self._temperature = temperature

    # 温度の取得
    def get_temperature(self):
        return self._temperature

シミュレーティッドアニーリングクラス

class SpinSystem(System):
    def __init__(self, spin_num_col, spin_num_row, interactions, kb=1, temperature=30):
        super().__init__(temperature, kb)
        self._spin_num_col = spin_num_col
        self._spin_num_row = spin_num_row
        self._interactions = interactions
        self._spin_map = self._create_spinmap(spin_num_row, spin_num_col)

    # 温度の設定
    def set_temperature(self, temperature):
        self._temperature = temperature

    # 温度の取得
    def get_temperature(self):
        return self._temperature

    # [i, j]のスピンを更新
    def _update_spin(self, i, j):
        # スピンが↑を向く確率
        up_prob = np.exp(-self._calc_spin_energy(i, j, 0)/(self._kb*self._temperature)) / \
                  (np.exp(-self._calc_spin_energy(i, j, 0)/(self._kb*self._temperature)) + \
                  np.exp(-self._calc_spin_energy(i, j, np.pi)/(self._kb*self._temperature)))
        rand = np.random.rand()
        if up_prob > rand:
            self._spin_map[i][j] = 0  # ↑向き
        else:
            self._spin_map[i][j] = 1  # ↓向き

    # スピンをランダムにnum_spin個更新
    def update_spins(self, num_spin):
        for i, j in zip(np.random.randint(0, self._spin_num_row, num_spin), np.random.randint(0, self._spin_num_col, num_spin)):
            self._update_spin(i, j)

    # [i, j]のスピンがphi方向向いているときのエネルギーを計算
    def _calc_spin_energy(self, i, j, phi):
        energy = 0
        try:
            energy += -self._interactions[i*j][(i-1)*j] * np.cos(phi - np.pi*self._spin_map[i-1][j])
        except IndexError as e:
            pass
        try:
            energy += -self._interactions[i*j][(i+1)*j] * np.cos(phi - np.pi*self._spin_map[i+1][j])
        except IndexError as e:
            pass
        try:
            energy += -self._interactions[i*j][i*(j+1)] * np.cos(phi - np.pi*self._spin_map[i][j+1])
        except IndexError as e:
            pass
        try:
            energy += -self._interactions[i*j][i*(j-1)] * np.cos(phi - np.pi*self._spin_map[i][j-1])
        except IndexError as e:
            pass
        return 0.5 * energy

    # 全エネルギーを計算する
    def calc_system_energy(self):
        energy = 0
        for i in range(self._spin_num_row):
            for j in range(self._spin_num_col):
                    energy += self._calc_spin_energy(i, j, np.pi if self._spin_map[i][j] == 1 else 0)
        return energy

    # spin_num_row × spin_num_colのスピンマップを作成
    def _create_spinmap(self, spin_num_row, spin_num_col):
        spin_map = np.zeros([spin_num_row, spin_num_col])
        for i in range(spin_num_row):
            for j in range(spin_num_col):
                spin_map[i][j] = 0 if np.random.rand() <= 0.5 else 1
        return spin_map

    # スピンマップを初期化する
    def initialize_spins(self):
        self._spin_map = self._create_spinmap(spin_num_row, spin_num_col)

    def get_spinmap(self):
        return self._spin_map

量子アニーリングクラス

class QuantumSpinSystem(System):
    def __init__(self, spin_num_col, spin_num_row, spin_systems, temperature, interactions, kb=1, transverse_field=10):
        super().__init__(temperature, kb)
        self._spin_num_col = spin_num_col
        self._spin_num_row = spin_num_row
        self._spin_systems = spin_systems
        self._transverse_field = transverse_field
        self._interactions = interactions

    def set_temperature(self, temperature):
        self._temperature = temperature
        for spin_system in self._spin_systems:
            spin_system.set_temperature(temperature)

    # 横磁場を設定
    def set_transverse_field(self, transverse_field):
        self._transverse_field = transverse_field

    # 横磁場による相互作用の係数を計算
    def _transverse_field_interaction(self):
        return 0.5 * self._kb * self._temperature * np.log(1/np.tanh(self._transverse_field / (self._kb * self._temperature * len(self._spin_systems))))

    # [i, j, k]のスピンを更新
    def _update_spin(self, i, j, k):
        # スピンが↑を向く確率
        up_prob = np.exp(-self._calc_spin_energy(i, j, k, 0)/(self._kb*self._temperature)) / \
                  (np.exp(-self._calc_spin_energy(i, j, k, 0)/(self._kb*self._temperature)) + \
                  np.exp(-self._calc_spin_energy(i, j, k, np.pi)/(self._kb*self._temperature)))
        rand = np.random.rand()
        if up_prob > rand:
            self._spin_systems[k].get_spinmap()[i][j] = 0  # ↑向き
        else:
            self._spin_systems[k].get_spinmap()[i][j] = 1  # ↓向き

    # スピンをランダムにnum_spin個更新
    def update_spins(self, num_spin):
        for i, j, k in zip(np.random.randint(0, self._spin_num_row, num_spin),
                           np.random.randint(0, self._spin_num_col, num_spin),
                           np.random.randint(0, len(self._spin_systems), num_spin)):
            self._update_spin(i, j, k)

    # [i, j, k]のスピンがphi方向向いているときのエネルギーを計算
    def _calc_spin_energy(self, i, j, k, phi):
        energy = 0
        # ij(スピンマップ)面方向の交換相互作用によるエネルギー計算
        try:
            energy += -self._interactions[i*j][(i-1)*j] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i-1][j])
        except IndexError as e:
            pass
        try:
            energy += -self._interactions[i*j][(i+1)*j] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i+1][j])
        except IndexError as e:
            pass
        try:
            energy += -self._interactions[i*j][i*(j+1)] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i][j+1])
        except IndexError as e:
            pass
        try:
            energy += -self._interactions[i*j][i*(j-1)] * np.cos(phi - np.pi*self._spin_systems[k].get_spinmap()[i][j-1])
        except IndexError as e:
            pass
        energy *= 0.5
        # k方向の相互作用(横磁場)によるエネルギー計算
        s1 = 1 if self._spin_systems[k].get_spinmap()[i][j] == 0 else -1
        #min_k = np.argmin(self.get_system_energies())
        try:
            s2 = 1 if self._spin_systems[k-1].get_spinmap()[i][j] == 0 else -1
            energy += -self._transverse_field_interaction() * s1 * s2
        except IndexError as e:
            pass
        try:
            s2 = 1 if self._spin_systems[k+1].get_spinmap()[i][j] == 0 else -1
            energy += -self._transverse_field_interaction() * s1 * s2
        except IndexError as e:
            pass
        return energy

    # 各スピンマップ(トロッタ?)のエネルギーを配列で返す
    def get_system_energies(self):
        return [spin_system.calc_system_energy() for spin_system in self._spin_systems]

検証

# 100x100個のスピンマップ
SPIN_COL_NUM = 100
SPIN_ROW_NUM = 100

INTERACTIONS = np.random.randn(
    SPIN_COL_NUM * SPIN_ROW_NUM, SPIN_COL_NUM * SPIN_ROW_NUM
)

if __name__ == '__main__':
    temperature = 1000  # 初期温度
    spin_system = SpinSystem(
        spin_num_col=SPIN_COL_NUM,
        spin_num_row=SPIN_ROW_NUM,
        interactions=INTERACTIONS,
        temperature=temperature
    )
    trotta_num = 10  # トロッタ数
    quantum_spin_system = QuantumSpinSystem(
        spin_num_col=SPIN_COL_NUM,
        spin_num_row=SPIN_ROW_NUM,
        temperature=temperature,
        interactions=INTERACTIONS,
        spin_systems=[SpinSystem(
                spin_num_col=SPIN_COL_NUM,
                spin_num_row=SPIN_ROW_NUM,
                interactions=INTERACTIONS,
                temperature=temperature
            ) for i in range(trotta_num)]
    )
    temperature_hist = []
    step_hist = []
    energy_hist = []
    energy2_hist = [[] for i in range(trotta_num)]
    update_num = 10
    step = 0
    delta_t = 1
    # 10Kまでdelta_t刻みで温度下げる
    while temperature > 10:
        # シミュレーテッドアニーリング系の温度を設定
        spin_system.set_temperature(temperature)
        # 量子アニーリング系の温度を設定
        quantum_spin_system.set_temperature(temperature)
        # 横磁場を設定。(温度の1000分の1とした)
        quantum_spin_system.set_transverse_field(temperature/1000)
        temperature -= delta_t
        # シミュレーテッドアニーリング系のスピンをupdate_num個更新
        spin_system.update_spins(num_spin=update_num)
        # 量子アニーリング系のスピンをupdate_num個更新
        quantum_spin_system.update_spins(num_spin=update_num)
        step += update_num
        energy = spin_system.calc_system_energy()
        temperature_hist.append(temperature)
        step_hist.append(step)
        energy_hist.append(energy)
        energy2 = quantum_spin_system.get_system_energies()
        for i, ener in enumerate(energy2):
            energy2_hist[i].append(ener)
        print('{}K : {}'.format(temperature, energy))
        print('quantum energy : ', energy2)
        print('average quantum energy : ', sum(energy2)/len(energy2))
        print(' ')

    plt.plot(step_hist, energy_hist, linestyle='dashed')
    for energy in energy2_hist:
        plt.plot(step_hist, energy)
    plt.show()

やってることは

  • 100x100個のスピンマップを作成。スピンの向きはランダムに初期化。イジングモデルなので↑、↓二方向のみ。

  • シミュレーティットアニーリングと量子アニーリング系で使用するスピンi、j間の交換相互作用を正規分布でランダムに初期化。効果検証のため両系で同じ交換相互作用を用いている。

  • 量子アニーリング系は内部的にトロッタ数(今回は10とした)のシミュレーティットアニーリング系(のインスタンス)を保持し、(隣接の)各シミュレーティットアニーリング系は横磁場を通じて相互作用している。

  • シミュレーティドアニーリング系と量子アニーリング系を同時に走らせて、1000K⇒10Kへ1K刻みで降温。降温に伴いに横磁場も1⇒0程度になるように変化させている。

  • エネルギー推移をみることで効果の検証。

f:id:popondelion:20171015005835p:plain

f:id:popondelion:20171015005853p:plain

↑は横軸が系の全更新数、縦軸が各スピンマップのエネルギー。 破線がシミュレーティッドアニーリング。

量子アニーリング系のエネルギーがシミュレーティッドアニーリング系のエネルギーより減少 していくことを期待したが、まったく減少しない・・●rz

横磁場と聞いていたので、スピンマップに対して垂直方向にスピン向ける効果があるとイメージしていたが、どちらかというと複数のスピンマップをトロッタ数分重ねていき3次元のスピン系を作成し、スピンマップ面方向の交換相互作用は時間・温度に非依存、重ねていった軸(スピンマップ垂直)方向の交換相互作用の大きさが横磁場の大きさ(時間)や温度に依存して変化する系のスピン変化をシミュレートしている感じがした。

金融 - 計量分析勉強メモ1

株価の収益率

t+Δt時点での株価をS(t+Δt)とすると、収益率Rは

R=\frac{S(t+Δt)-S(t)}{S(t)}

コールオプション

権利行使価格をEとすると、コールオプション価格をCとするとΔt後の利益は

max(S(t+Δt)-E, 0)-C

S(t+Δt)-E>Cの場合得、S(t+Δt)-E<Cの場合損

確率微分方程式

t~t+Δtでの収益率は

\frac{S(t+Δt)-S(t)}{S(t)}=μΔt+σ\sqrt{Δt}Z

uΔt:瞬間的な収益率

Δt⇒0で

\frac{dS(t)}{S(t)}=μdt+δdW(t)

W(t):標準ブラウン運動

σ=0の場合、無リスク証券の価格変動

連続複利収益率

ブラウン運動

算術ブラウン運動

dX(t)=μdt+σdW(t)

方程式解:

X(t)=X(0)+μt+σW(t)

幾何ブラウン運動

dX(t)=μX(t)dt+σX(t)dW(t)

方程式解:

X(t)=X(0)e^{(μ-\frac{σ^{2}}{2})t+σW(t)}

O-U(オルンシュタイン-ユーレンベック)過程

dX(t)=κ(μ-X(t))dt+σdW(t)

方程式解:

X(t)=μ+(X(0)-μ)e^{-κt}+σ\int_0^{t} e^{-κ(t-s)}dW(s)

X(0)=xのときX(t)は

N( (x-μ)e^{-κt}+μ, \frac{σ^{2}(1-e^{-2κt})}{2κ} )

に従う。

t=0⇒∞で(中心,分散)が(x,0)⇒(μ,σ2/(2κ))

平方根過程

dX(t)=κ(μ-X(t))dt+σ\sqrt{X(t)}dW(t)

参考

ファイナンスへの計量分析

www.amazon.co.jp

香港旅

電車内から

f:id:popondelion:20170816215256j:plain

九龍駅でさまよっているときに撮った写真

f:id:popondelion:20170816215450j:plain

蓮コラっぽい建物

f:id:popondelion:20170816215515j:plain

f:id:popondelion:20170816215527j:plain

ホテル

f:id:popondelion:20170816232120j:plain f:id:popondelion:20170816232124j:plain

バスルーム

f:id:popondelion:20170816220003j:plain

九龍公園

f:id:popondelion:20170816215938j:plain

f:id:popondelion:20170816220054j:plain

f:id:popondelion:20170816220105j:plain

f:id:popondelion:20170816220137j:plain

時計塔

f:id:popondelion:20170816220247j:plain

シンフォニーオブライツ

f:id:popondelion:20170816220401j:plain

f:id:popondelion:20170816220434j:plain

f:id:popondelion:20170816220527j:plain

f:id:popondelion:20170816220614j:plain

f:id:popondelion:20170816220627j:plain

f:id:popondelion:20170816220722j:plain

f:id:popondelion:20170816220748j:plain

周辺

f:id:popondelion:20170816220847j:plain

f:id:popondelion:20170816220908j:plain

夜の裏路地

f:id:popondelion:20170816221004j:plain

f:id:popondelion:20170816221012j:plain

f:id:popondelion:20170816221019j:plain

九龍湾方面

f:id:popondelion:20170816221230j:plain

f:id:popondelion:20170816221256j:plain

f:id:popondelion:20170816221330j:plain f:id:popondelion:20170816221535j:plain f:id:popondelion:20170816221544j:plain f:id:popondelion:20170816221242j:plain

f:id:popondelion:20170816221358j:plain

f:id:popondelion:20170816221437j:plain f:id:popondelion:20170816221450j:plain f:id:popondelion:20170816221502j:plain

f:id:popondelion:20170816221517j:plain

ごちゃごちゃした街並み

f:id:popondelion:20170816221701j:plain f:id:popondelion:20170816221713j:plain f:id:popondelion:20170816221725j:plain

中環

f:id:popondelion:20170816221814j:plain f:id:popondelion:20170816221832j:plain f:id:popondelion:20170816221824j:plain

食べ物

f:id:popondelion:20170816221910j:plain

香港国際空港で遭遇した雀

f:id:popondelion:20170816222013j:plain

香港メモ①

通信手段

プリペイドSIMがAmazonで買える

Amazon | 【中国移動香港】4G/3G 中国TDD・香港FDD10日間1.5GBデータプリペイドSIM [並行輸入品] | SIMカード 通販

SIMフリースマホ必要

回線形式で対応機種が異なるので確認必要


充電

200/220V 50Hz 変圧器が必要

Amazon CAPTCHA


交通手段

空港から市内

MTR

・エアポートエクスプレス
約6:00~24:00まで12分おきに運航
九龍までHK$90
オクトパスカード利用可


オクトパスカード

MTR、地下鉄、電車、シティバス、フェリーで共通で使える便利カード

・買い方

www.youtube.com

・チャージ

www.youtube.com


空港

成田空港

チェックイン(48時間まえからWebチェックイン可⇒バーコードかざす必要あり?)⇒荷物検査⇒セキュリティチェック⇒税関申告(100万以上の現金等持ち出す場合のみ)⇒出国審査⇒搭乗ゲート

・バニラエア
第3ターミナル
23×56×36cm 10kgまで持ち込み可

香港国際空港

出発の1時間半~2時間前には到着しておいたほうがいい


お金

クレジットカード海外キャッシング

www.youtube.com

現地で現金両替

空港
銀行
ホテル⇒手数料高い、レート悪い
自動両替機⇒24時間可


Wi-Fi

GovWiFi

公共無料WiFi
SSID :「freegovwifi」「freegovwifi-e」

MTR

SSID : 「MTR Free Wi-Fi

香港国際空港

SSID :「#HKAirport Free WiFi


時差

1時間


為替レート

1HKD = 14.1529607 円(2017/08/06)

仮想通貨銘柄メモ①

1. カイカ

概要

【特色】中国留学生創業のSIだが中国事業撤退。フィスコ系ネクス傘下で経営再建進捗。旧SJI

株価

企業情報

設立:1989年7月14日(商号変更 2017年2月1日)
事業内容:情報サービス事業
資本金:7,775,162千円(2017年6月30日現在)
社員数:463名(2017年4月30日現在 連結)
市場:東京証券取引所JASDAQ(スタンダード)

IR

f:id:popondelion:20170723203347p:plain

f:id:popondelion:20170723203427p:plain

ニュース

ウェブトラベルがフィスコ仮想通貨取引所でビットコイン決済を開始
まぐまぐニュース!-2017/07/03

www.mag2.com

【経済】CAICAコインの追加発行をロック、フィスコ仮想通貨取引所でも取扱開始 2017年07月18日11時36分

kabutan.jp

リネットジャパン—カイカと共同でASEANにて仮想通貨、ブロックチェーン活用ファイナンスサービスの実証実験 2017/06/05

zuuonline.com

メモ

フィンテック戦略室

今、その変化の要因となる新しいテクノロジーが登場しています。 当社は、その中でも特に重要な変化要因として「人工知能」と「ブロックチェーン」に注目しています。
これらの技術は既存の金融インフラを刷新するほどの可能性を秘めています。

・先端技術研究所

現在、当社のフィンテック戦略に即したブロックチェーン、クラウドコンピューティング、ビッグデータ、人工知能などの技術に関する調査・研究に取り組むと同時に、新たな環境・手法・プラットフォーム、オープンソースなどの開発技術においても調査・研究を行っております。

2. セレス

概要

【特色】『モッピー』『モバトク』などスマホ向けポイントサイトを運営。求人メディアも。広告収入が柱

株式会社セレスは、ポイントサイトの運営を行う企業である。『インターネットマーケティングを通じて豊かな世界を実現する』を経営理念に掲げ、パソコン、スマートフォン、フィーチャー・フォン上で複数のインターネットメディアサービスを展開する企業。

株価

企業情報

設立年月日:2005年1月28日
市場名:東証1部
上場年月日:2014年10月22日
決算:12月末日
単元株数:100株
従業員数:
(単独) 67人 従業員数
(連結) -人
平均年齢:31.5歳
平均年収:4,540千円

事業内容

f:id:popondelion:20170723210856p:plain f:id:popondelion:20170723210926p:plain

沿革

f:id:popondelion:20170723210110p:plain

IR

f:id:popondelion:20170723210204p:plain

f:id:popondelion:20170723210227p:plain

f:id:popondelion:20170723210311p:plain

ニュース

仮想通貨取引所のビットバンクがポイントサイトのセレスから8.5億円を調達、スマホ向けサービスで協業 2017年7月12日

jp.techcrunch.com

セレス—大幅続伸、ビットコイン海外送金サービス「Sobit」の開始で 2017年5月22日

zuuonline.com

株式会社セレス、IndieSquare と提携 仮想通貨を渋谷・新宿駅周辺で獲得できる「モッピーGO」の提供開始 2017.2.10

venturetimes.jp


3. フィスコ

概要

金融関連情報をネットで提供。M&Aで事業多角化、企業調査やコンサル、ネット旅行業も育成

株式会社フィスコは、日本の独立系金融情報配信会社である。ブルームバーグトムソン・ロイターに代表される金融情報端末やヤフーなどのポータル・サイトに情報提供を行うほか、個人投資家向け会員制投資情報クラブやモバイルなどの情報配信ネットワークを通じてリアルタイムで投資情報を提供している。

株価

企業情報

設立年月日:1995年5月15日
市場名:東証JASDAQグロース
上場年月日:2006年6月8日
決算:12月末日
単元株数:100株
従業員数:
(単独) 27人 従業員数
(連結) 939人
平均年齢:44.2歳
平均年収:5,530千円

事業内容

f:id:popondelion:20170723211819p:plain

f:id:popondelion:20170723211914p:plain

IR

f:id:popondelion:20170723212023p:plain

ニュース

TDSEとフィスコによるFinTech戦略 人工知能エンジンScorobo@ for Fintech第一弾株価予測AI評価と今後の展開 2017年4月17日

prtimes.jp

論文役メモ ~ 自然言語処理 ~ Language Modeling with Gated Convolutional Networks ~ Abstract

Language Modeling with Gated Convolutional Networks

https://arxiv.org/pdf/1612.08083.pdf

Facebook AI ResearchによるCNNを利用した自然言語処理に関する論文

訳メモ

Abstract

The pre-dominant approach to language modeling to date is based on recurrent neural networks.
Their success on this task is often linked to their ability to capture unbounded context.
In this paper we develop a finite context approach through stacked convolutions, which can
be more efficient since they allow parallelization over sequential tokens. 
We propose a novel simplified gating mechanism that outperforms Oord et al. (2016b) 
and investigate the impact of key architectural decisions. 
The proposed approach achieves state-of-the-art on the WikiText-
103 benchmark, even though it features longterm dependencies, as well as competitive results
on the Google Billion Words benchmark.
Our model reduces the latency to score a sentence by an order of magnitude compared to a
recurrent baseline. To our knowledge, this is the first time a non-recurrent approach is competitive
with strong recurrent models on these large scale language tasks.
これまでの言語モデルへの大半のアプローチはRNNをベースとしていた。
RNNによる言語モデリングの成功は、RNNがunbounded contextをとらえる能力をもっていることに繋がっていた。
本論文では、シーケンシャルなトークンに対して並列処理が可能で、より効率的である多層畳み込みを使用した有限コンテキストアプローチを構築する。
Oord et al. (2016b)を超える単純化したゲートメカニズムを提案し、重要な構造決定の影響を調べる。
提案するアプローチは長期依存性をもっているが、WikiText-103ベンチマークに関して最先端を実現する。
Google Billion Words benchmarkに対しても競り合える結果を出す。
我々のモデルは、リカレントベースラインと比較して、文のスコアリングの遅延を削減する。
我々の知る限りでは、これらの巨大スケールの言語タスクに対してRNN以外のアプローチが、強力なRNNに匹敵する結果をだすのは初めてである。