毎日テキストマイニング

180日間、毎日テキストマイニングをするブログです

2018/09/08【77日目】ソフトマックスの温度を調整してみる

ディープラーニング関連の話が続いて申し訳ないですが、今日もその続きです。

テキストを生成する際に、次に来る確率が一番高い単語を選ぶのが貪欲的サンプリング(greedy sampling)という。 ただし、毎回確率が高い単語だけを選んでいても、変わり映えがしないのである程度のランダム性を考慮する必要があり、確率をもったものを確率的サンプリングというそうです。 とりあえず『PythonとKerasによるディープラーニング』の8章をみていきます。

import keras
import numpy as np

path = keras.utils.get_file(
    'nietzsche.txt',
    origin='https://s3.amazonaws.com/text-datasets/nietzsche.txt')
text = open(path).read().lower()
print(text)

textの中身はこんな感じ。

preface


supposing that truth is a woman--what then? is there not ground
for suspecting that all philosophers, in so far as they have been
dogmatists, have failed to understand women--that the terrible
seriousness and clumsy importunity with which they have usually paid
their addresses to truth, have been unskilled and unseemly methods for
winning a woman? certainly she has never allowed herself to be won; and

sequences、maxlen、unique_charactersの3次元のテンソルが必要だそうなので、for文を使ってリストに入れていきます。

print(sentences[0])
preface


supposing that truth is a woman--what then? is the

なるほど、60文字のセンテンスになっています。

print(next_chars[0])
r

こっちはよくわりませんがrが入っています。 あとはサンプル通りですが、こんな感じでテキスト生成ができるようです。

from keras import layers

model = keras.models.Sequential()
model.add(layers.LSTM(128, input_shape=(maxlen, len(chars))))
model.add(layers.Dense(len(chars), activation='softmax'))
optimizer = keras.optimizers.RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)
def sample(preds, temperature=1.0):
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)
import random
import sys

for epoch in range(1, 60):
    print('epoch', epoch)
    # Fit the model for 1 epoch on the available training data
    model.fit(x, y,
              batch_size=128,
              epochs=1)

    start_index = random.randint(0, len(text) - maxlen - 1)
    generated_text = text[start_index: start_index + maxlen]
    print('--- Generating with seed: "' + generated_text + '"')

    for temperature in [0.2, 0.5, 1.0, 1.2]:
        print('------ temperature:', temperature)
        sys.stdout.write(generated_text)

        # We generate 400 characters
        for i in range(400):
            sampled = np.zeros((1, maxlen, len(chars)))
            for t, char in enumerate(generated_text):
                sampled[0, t, char_indices[char]] = 1.

            preds = model.predict(sampled, verbose=0)[0]
            next_index = sample(preds, temperature)
            next_char = chars[next_index]

            generated_text += next_char
            generated_text = generated_text[1:]

            sys.stdout.write(next_char)
            sys.stdout.flush()
        print()

実行結果。

epoch 1
Epoch 1/1
200278/200278 [==============================] - 271s 1ms/step - loss: 3.2687
--- Generating with seed: "injunction or other. this subjection is a potent means of ac"
------ temperature: 0.2
injunction or other. this subjection is a potent means of actttttttbtvttttttttltttttttvtttttttttttttabttttttttttttttltttttttttttttbtvtttvttttttttlttttblvtttttttttttttttttttttttbttttlatttltttttbltttttttttttttttttttttvtttttttttttttttttttttbtattttttttttttttblttttbtltttvtttttvttttlttttttlttvvattvtlttttttttttttbttvttttatttttbttttttttttttttvtttttttbtttttttvtvtttttbtvtttvttbttvttttttttttttvttttttvbtdtttttlttttttttttvtattttttbttttvtbtttltttvtttttttttblttttttttbtvt
------ temperature: 0.5
tlttttttttttvtattttttbttttvtbtttltttvtttttttttblttttttttbtvttttttatsbtvt btvatggbvtttvddvbbievrlbstntvvttttvtttttavtlvthtvrvhbbtenbtvvbtvanrrlbbvvlabvlatvnablitthntadtltttlbtcta bvvtdtttvdstbdavttavlttbtav tttvttlvtvgvtvtltbtvvftat ltvtlttnflvtntllttlvtdtntlsbttvtrtattbtvtbletbtvtttttttlldbdvttrbdvtatbrbttvtbtttbtrdvtll btlttlvtbndrvvtttavlbvbdlatbtbttbgttatlvtvltvfdbbtbtbatbattra agttittbtllhltbltrltdiagvtttttdttbbvefvyhtt vdtitvvvittttttdttliltgttbtbtlat
------ temperature: 1.0
trltdiagvtttttdttbbvefvyhtt vdtitvvvittttttdttliltgttbtbtlat ltrdtwdsbsbbfivrhithbldggbtedlblhttaftbllvsbi trbgtiraatsnvbotnavvaglvlu
i ialtimtitbtbngttdaathayvfs
iltvrbdategbnaignltbbabdttflerlhodittartvblydglnufpdrgvetvrgblavbos.vb,mdsitnidbrlgvyvb urr filvlbaimlsteyvtohrvnr ar-iutwfvaathrtvttad,fblrttaldhlitgabafitlnttdisvibyot,filbagttsvtbhisajbleuahllatbtilttnvtibdlusbhyltlvlltbtttvbeoturvb ttctmdy,rowdgisvhdbtteadvgtdabtshgh invsrybbllv odtv gvddstdv
------ temperature: 1.2
tctmdy,rowdgisvhdbtteadvgtdabtshgh invsrybbllv odtv gvddstdv-ttbdgabtlr
tdrsvtavnvvaitvvbgb
dtlvtftdvstb-abvbatha)srl"b yitfattbagblh;ttvldallr.ratetldyihotiddi,lo,tabsitlydaahlrwylalrthhhtflf.sgadvoatbvvvybhfdzttpvvrie-gyfsgtdfijnbtrsyndlfdlbtloavbtlgt.hlophl)agwdtvlhbbqlvrl ntivttl nsrf
b hd vllrvlgbmd diaolmtiaoslnttrltt dltvhdlttbtiisaedylirtbvbsthtlvdfttlbflirfn rftadvluvgletldfb)vltdfrbdfntrbbsvgayitlbstahvvrgg tyarbltvvdaotsvpbuviaitbnrrthd;bhtbbalt

前と違うのはソフトマックスの温度が設定されてあることですね。 確率的サンプリングの確率性を制御するパラメータだそうで、温度が高ければ高いほどランダム性が高くなり、温度が低いとランダム性の低い結果が返ってきます。 1世代だけですと、それほど違いがわかりませんね。

今日の結果

今日のAKBの呟きは55件でした。 要約するとこんな感じです。

さすがの演技…わたしも絶対次言う。物理的に無理とか言っちゃったから気まずいけどこのツイート見てないと信じて「ずっと見てたよ!」使う。お見送りの時に隣にいたメンバーがおつかれさまーというファンの方に「ずっと見てたよー!?」と言った。その瞬間のファンの方の嬉しそうな顔一生忘れない。物理的にずっと見てる訳はないのに!それでもその言葉があんな幸せな…シアターの女神公演。素敵な衣装がたくさん。まだ衣装いけかね!!!!!焼肉が食べたい!!いま!いますぐに!!!!!シアターの女神公演初日終わりた!!見てくださった方ありがとうございた!チームB最高ねー!!!お金ほしいみたい。#柏木由紀高橋朱里チームB『シアターの女神公演』初日見学させていただきた!
#ganbarena今日は日本インドネシア国交樹立60周年記念「音楽フェスティバル」にて、AKB48がライブをし。これに先立ち、昨日は代表して挨拶をさせていただきた。同期とも会えてうれしかった♡高橋朱里チームB『シアターの女神』公演ありがとうございた✨✨今の気持ちとともに。。#きょうのせいちゃん#AKB劇場公演#チームBチームB初日公演行ってき!!#シアターの女神公演#AKB劇場公演今日はチームBの初日公演#シアターの女神公演を見学させて頂きた❗️❗️この公演初めて劇場で観たがすごく感動して、皆さんキラキラしてた✨✨すごく素敵な公演?
にくにく#ダイスキャラバン22:30からSHOWROOMやりまーす☆チーム4の公演の雰囲気が少しでも伝われば嬉しい?❤️そしてぜひ一度劇場公演に見に来てください?。#スリーアウトサヨナラ編見てきた!2人ともとっても頑張っててかっこよかったー!萌ちゃんの舞台を見たのは久しぶりだったんだけど、前よりももっと演技が上手で尊敬…!まきほも想像をはるかに超えて演技がお上手でした?
'嬉しい': 7, '楽しい': 5, 'ない': 3, 'すごい': 3, 'かわいい': 2, 'こわい': 2, '青い': 1, '気まずい': 1, 'ほしい': 1, '凄い': 1, '感慨深い': 1, 'ものすごい': 1, 'よい': 1, '熱い': 1, 'よろしい': 1, '可愛い': 1, 'つらい': 1, '辛い': 1, '怖い': 1, '優しい': 1, '長い': 1, 'うれしい': 1, '仲良い': 1, '面白い': 1, 'いい': 1, '遅い': 1, 'にくい': 1, 'かっこよい': 1
'公演': 32, 'チーム': 20, '初日': 15, 'シアター': 15, '女神': 15, '皆さん': 9, '高橋': 8, 'ちゃん': 8, '今日': 8, '嬉しい': 7, 'よう': 7, '劇場': 7, '人': 6, '楽しい': 5, '演技': 5, 'さん': 5, 'エーケービーフォーティーエイト': 5, 
'公演': 32, 'する': 29, 'チーム': 20, '初日': 15, 'シアター': 15, '女神': 15, '見る': 14, 'てる': 12, 'くる': 11, 'いる': 10, '皆さん': 9, 'せる': 9, 'くださる': 9, '頑張る': 9, '高橋': 8, 'ちゃん': 8, '今日': 8, '嬉しい': 7, 'よう': 7, '劇場': 7, '出来る': 7, '人': 6, 'れる': 6, '楽しい': 5, '演技': 5, 'さん': 5, 'エーケービーフォーティーエイト': 5, 'みる': 5,

f:id:rimt:20180912084027p:plain

f:id:rimt:20180912084058p:plain