nce_loss()(Noise-contrastive estmiationっぽい損失)の正体を暴こうとして、5秒で挫折しました。

1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...

Tensorflowの勉強で、「Vector Representations of Words」 ~単語のベクトル表現を得る冒険~
https://www.tensorflow.org/versions/r0.9/tutorials/word2vec/index.html
ここに行ってみると、nce_loss()という、とっても便利なヘルパーに出会えます。

この、損失関数

loss = tf.reduce_mean(
tf.nn.nce_loss(nce_weights, nce_biases, embed, train_labels,
num_sampled, vocabulary_size))

を勾配降下法を用いて小さくしていくようにトレーニングをすると、単語のベクトル表現が得られます。最高ですね。

いや、いや、いや。。

nce_loss() <- これはなんですか? Noise-contrastive estmiationの損失と言われましても、全く分かりません。

(ちなみに、いろんな記事をネットで見ているのですが、如何せん当方機械学習素人すぎて、理解に至れないという経緯がありつつの。いま。もう論文読むしかないのでしょうか。 状態。)

ということで、このメソッドがどんな風にかかれているのか中を覗いて見ます。中身を見ればわかるでしょう。

>>> import inspect
>>> inspect.getsourcefile(tf.nn.nce_loss)
'/Library/Python/2.7/site-packages/tensorflow/python/ops/nn.py'

上のような感じで、定義されているファイルを見つけました。

nn.py

def nce_loss(weights, biases, inputs, labels, num_sampled, num_classes,
num_true=1,
sampled_values=None,
remove_accidental_hits=False,
partition_strategy="mod",
name="nce_loss"):
"""Computes and returns the noise-contrastive estimation training loss.
See [Noise-contrastive estimation: A new estimation principle for
unnormalized statistical models]
(http://www.jmlr.org/proceedings/papers/v9/gutmann10a/gutmann10a.pdf).
Also see our [Candidate Sampling Algorithms Reference]
(../../extras/candidate_sampling.pdf)
Note: In the case where `num_true` > 1, we assign to each target class
the target probability 1 / `num_true` so that the target probabilities
sum to 1 per-example.
Note: It would be useful to allow a variable number of target classes per
example.  We hope to provide this functionality in a future release.
For now, if you have a variable number of target classes, you can pad them
out to a constant number by either repeating them or by padding
with an otherwise unused class.
Args:
weights: A `Tensor` of shape `[num_classes, dim]`, or a list of `Tensor`
objects whose concatenation along dimension 0 has shape
[num_classes, dim].  The (possibly-partitioned) class embeddings.
biases: A `Tensor` of shape `[num_classes]`.  The class biases.
inputs: A `Tensor` of shape `[batch_size, dim]`.  The forward
activations of the input network.
labels: A `Tensor` of type `int64` and shape `[batch_size,
num_true]`. The target classes.
num_sampled: An `int`.  The number of classes to randomly sample per batch.
num_classes: An `int`. The number of possible classes.
num_true: An `int`.  The number of target classes per training example.
sampled_values: a tuple of (`sampled_candidates`, `true_expected_count`,
`sampled_expected_count`) returned by a `*_candidate_sampler` function.
(if None, we default to `log_uniform_candidate_sampler`)
remove_accidental_hits:  A `bool`.  Whether to remove "accidental hits"
where a sampled class equals one of the target classes.  If set to
`True`, this is a "Sampled Logistic" loss instead of NCE, and we are
learning to generate log-odds instead of log probabilities.  See
our [Candidate Sampling Algorithms Reference]
(../../extras/candidate_sampling.pdf).
Default is False.
partition_strategy: A string specifying the partitioning strategy, relevant
if `len(weights) > 1`. Currently `"div"` and `"mod"` are supported.
Default is `"mod"`. See `tf.nn.embedding_lookup` for more details.
name: A name for the operation (optional).
Returns:
A `batch_size` 1-D tensor of per-example NCE losses.
"""
logits, labels = _compute_sampled_logits(
weights, biases, inputs, labels, num_sampled, num_classes,
num_true=num_true,
sampled_values=sampled_values,
subtract_log_q=True,
remove_accidental_hits=remove_accidental_hits,
partition_strategy=partition_strategy,
name=name)
sampled_losses = sigmoid_cross_entropy_with_logits(logits,
labels,
name="sampled_losses")
# sampled_losses is batch_size x {true_loss, sampled_losses...}
# We sum out true and sampled losses.
return _sum_rows(sampled_losses)

なるほど、内部で、_compute_sampled_logitsこのメソッドを呼んでいるのか。よし、いったん退散しよう。

そして、出直そう。

(CBOWモデル、skip-gramモデルから損失関数を得る流れが、り、理解できない。)

出直します!


1 Star2 Stars3 Stars4 Stars5 Stars (まだ評価されていません)
Loading...
      この投稿は審査処理中  | 元のサイトへ