zondag 14 april 2019

1 - More NLP

Met de feitelijk succesvolle afsluiting van 'Matters that matter', waar het laatst gevonden model nu in de praktijk wordt getest, is het keuk om te kijken of het model ook bij andere nlp taken goed functioneerd. Ik vind het ongelovelijk dat het model in 2 a 3 epochs al zo snel bij zo'n hoge validatie nauwkeurigheid weet te komen. Is dit een super model voor nlp taken? Of is de data zo 'voorspelbaar'?

def Model_attention_conv():
model = Sequential()
model.add(Embedding(vocab_size, 256, input_length=input_length))
model.add(Conv1D(512, 5, activation='relu'))
model.add(MaxPooling1D())
model.add(SeqSelfAttention(attention_activation='sigmoid'))
model.add(Flatten())
model.add(Dense(labels_max, activation='sigmoid'))
return model

Ik kijk bij Kaggle of er nog een nlp uitdaging bij is gekomen. En ja hoor, er is er net weer een gestart:

Jigsaw Unintended Bias in Toxicity Classification
Detect toxicity across a diverse range of conversations


Oke, dit gaat dus over ongewenst taalgebruik in online conversaties. Leuk om ons model eens mee te testen.
Een voorbeeld van 'toxic' in de kolom 'insult' :

"haha you guys are a bunch of losers."

Met een score van 0.89.

De verschillende types toxic taalgebruik zijn wel geklassificeerd maar de contest gaat alleen over toxic ja/nee. Hierbij is > .5 toxic.

Het tokenizen en 'padding' (naar de jiuste lengte brengen) laat ik deze keer aan de Keras routins daarvoor over. En na het aanpassen van de  loss functie naar kleinste kwardratische afwijking  (mean squared error) draait het model al snel.

Model creation ...
_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
embedding_1 (Embedding)      (None, 100, 256)          90746368
_________________________________________________________________
conv1d_1 (Conv1D)            (None, 96, 512)           655872
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 48, 512)           0
_________________________________________________________________
seq_self_attention_1 (SeqSel (None, 48, 512)           32833
_________________________________________________________________
flatten_1 (Flatten)          (None, 24576)             0
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 24577
=================================================================
Total params: 91,459,650
Trainable params: 91,459,650
Non-trainable params: 0

Helaas vallen de resultaten zwaar tegen. De loss en val_loss lijken zich niet te verbeteren ondanks bijvoorbeeld het aanpassen van de learning rate of de optimizer. (Adam naar stochastic gradient descent (SDG) . Vreemd. De aangeboden data lijkt toch goed te zijn.

In navolging van een voorbeeld kernel bij Kaggle maak ik de voorspelde uitkomensten digitaal: 0 voor < .5 en 1 voor groter >= 5.

y_train = np.where(train['target'] >= 0.5, 1, 0)

Tevens pas ik daarvoor de loss functie aan naar de 'binary_crossentropy'

Ook pas ik de manier van tokenizen aan:

Van
print('Reading data ...')
path = 'C:\\Users\\DirkW\\Documents\\Jigsaw\\'
train = pd.read_csv('C:\\Users\\DirkW\\Documents\\Jigsaw\\train.csv', encoding="ISO-8859-1") #encoding='utf-8')
train = train.fillna("")
x_train = preprocess(train['comment_text'])
x_train = x_train.astype(str, errors='ignore').values.tolist()
x_train = [''.join(x) for x in x_train]

test = pd.read_csv('C:\\Users\\DirkW\\Documents\\Jigsaw\\test.csv', encoding="ISO-8859-1")
test = test.fillna("")
x_test= preprocess(test['comment_text'])
#x_test = x_test.astype(str, errors='ignore').values.tolist()
#x_test = [''.join(x) for x in x_test]

print('Tokenizing data ...')
'''
'''
tokenizer = Tokenizer(num_words=50000)
vocab_size = len(tokenizer.word_index) + 1
tokenizer.fit_on_texts(x_train)

X_train = tokenizer.texts_to_sequences(x_train)
X_test = tokenizer.texts_to_sequences(x_test)

print('Padding data ...')
X_train = pad_sequences(X_train, padding='post', maxlen=input_length)
X_test = pad_sequences(X_test, padding='post', maxlen=input_length)

naar

train = pd.read_csv('C:\\Users\\DirkW\\Documents\\Jigsaw\\train.csv', encoding="ISO-8859-1") #encoding='utf-8')
train = train.fillna("")
x_train = preprocess(train['comment_text'])

tokenizer = text.Tokenizer()
tokenizer.fit_on_texts(list(x_train) + list(x_test))
vocab_size = len(tokenizer.word_index) + 1
x_train = tokenizer.texts_to_sequences(x_train)
x_test = tokenizer.texts_to_sequences(x_test)
x_train = sequence.pad_sequences(x_train, maxlen=input_length)
x_test = sequence.pad_sequences(x_test, maxlen=input_length)

De tokenizer gebruikt nu zowel train als test teksten. Ik heb geen maximaal aantal woorden meer opgegeven en de 'moeilijke ombouw stappen zijn eruit:

x_train = x_train.astype(str, errors='ignore').values.tolist()
x_train = [''.join(x) for x in x_train]

De loss lijkt nu in ieder geval te verbeteren. Helaas de validation loss nog niet. Die wordt vooralsnog alleen maar slechter:

1443899/1443899 [==============================] - 1033s 715us/step - loss: 0.1502 - val_loss: 0.1394

Epoch 00001: val_loss improved from inf to 0.13939, saving model to model-best.h5
Epoch 2/20
1443899/1443899 [==============================] - 1019s 706us/step - loss: 0.1275 - val_loss: 0.1397

Epoch 00002: val_loss did not improve from 0.13939
Epoch 3/20
1443899/1443899 [==============================] - 1031s 714us/step - loss: 0.1092 - val_loss: 0.1516

Epoch 00003: val_loss did not improve from 0.13939
Epoch 4/20
 533050/1443899 [==========>...................] - ETA: 10:33 - loss: 0.0847

Maar ... we zijn nog maar bij de 4e epoch. Wie weet ... Het duurt nu wel lang: 1030 sec per epoch!





1443899/1443899 [==============================] - 1033s 715us/step - loss: 0.1502 - val_loss: 0.1394

Epoch 00001: val_loss improved from inf to 0.13939, saving model to model-best.h5
Epoch 2/20
1443899/1443899 [==============================] - 1019s 706us/step - loss: 0.1275 - val_loss: 0.1397

Epoch 00002: val_loss did not improve from 0.13939
Epoch 3/20
1443899/1443899 [==============================] - 1031s 714us/step - loss: 0.1092 - val_loss: 0.1516

Epoch 00003: val_loss did not improve from 0.13939
Epoch 4/20
1443899/1443899 [==============================] - 1029s 712us/step - loss: 0.0900 - val_loss: 0.1696

Epoch 00004: val_loss did not improve from 0.13939
Epoch 5/20
1443899/1443899 [==============================] - 1015s 703us/step - loss: 0.0725 - val_loss: 0.1871

Epoch 00005: val_loss did not improve from 0.13939
Epoch 6/20
1443899/1443899 [==============================] - 1006s 697us/step - loss: 0.0574 - val_loss: 0.2166

Epoch 00006: val_loss did not improve from 0.13939
Epoch 00006: early stopping

Jigsaw Unintended Bi

as in Toxicity Classification

Detect toxicity across a diverse range of conversations

Jigsaw Unintended Bias in Toxicity Classification

Detect toxicity across a diverse range of conversations

Geen opmerkingen:

Een reactie posten