Изменения

Перейти к: навигация, поиск

Рекурсивные нейронные сети

289 байт добавлено, 19:30, 13 апреля 2020
Примеры кода
При обучении последовательных структур и деревьев в задачах обработки естественного языка, фразы и предложения моделируются через векторное представление слов. 
Базовая структура сети является бинарным деревом, состоящим из родительского компонента (корня), и дочерних компонентов (листьев) Каждая группа . Каждый компонент - набор нейронов, размер которого зависит от сложности входных данных. Входная последовательность данных подаются подаётся на листья, а корень использует классификатор для определения класса и меры (score)
Рекурсивная нейронная сеть использует следующую формулу для вычисления родительского вектора:
*<math>f</math> — нелинейную функция активации типа гиперболического тангенса
*<math>bias</math> - cмещение, оно может быть добавлено в качестве дополнительного столбца к <math>W</math>, если к конкатенации входных векторов добавляется 1.
Родительские векторы должны иметь одинаковую размерность, чтобы быть рекурсивно совместимыми и использоваться в качестве входных данных для следующей композиции.
Последующие шаги получают на вход score меру предыдущего корня и следующее слово последовательности, таким образом пока в сети не будет сформировано дерево со всеми словами в последовательности.
Деревья могут иметь разную структуру, выбор лучшей подструктуры дерева для сети основывается на их мере. Мера дерева - сумма мер на каждом узле:
Опишем здесь пример построения сети, опустив построение дерева.
[https://github.com/yc930401/RecNN-pytorch Полный листинг кода для]анализа тональности текста на PyTorch ] (из статьи [https://nlp.stanford.edu/~socherr/EMNLP2013_RNTN.pdf Socher et al.(2013c)])
class RNTN(nn.Module):
def __init__(self, word2index, hidden_size, output_size):
super(RNTN,self).__init__()
<font color="green"># Для рекурсивной нейронной сети обязательно нужно для векторное представление слов</font>
self.word2index = word2index
self.embed = nn.Embedding(len(word2index), hidden_size)
self.V = nn.ParameterList([nn.Parameter(torch.randn(hidden_size * 2, hidden_size * 2)) for _ in range(hidden_size)]) <font color="green"># Тензор</font>
self.W = nn.Parameter(torch.randn(hidden_size * 2, hidden_size))
self.b = nn.Parameter(torch.randn(1, hidden_size)) <font color="green"># bias</font>
self.W_out = nn.Linear(hidden_size, output_size)
<font color="green"># инициализация весов</font>
def init_weight(self):
nn.init.xavier_uniform(self.embed.state_dict()['weight'])
self.b.data.fill_(0)
<font color="green"># прямое распространение</font>
def tree_propagation(self, node):
recursive_tensor = OrderedDict()
recursive_tensor.update(self.tree_propagation(node.right))
concated = torch.cat([recursive_tensor[node.left], recursive_tensor[node.right]], 1) <font color="green"># 1x2D</font>
xVx = []
for i, v in enumerate(self.V):
recursive_tensor[node] = current
return recursive_tensor
def forward(self, Trees, root_only=False):
propagated = []
for epoch in range(EPOCH):
losses = []
<font color="green"># learning rate annealing</font>
if RESCHEDULED == False and epoch == EPOCH // 2:
LR *= 0.1
optimizer = optim.Adam(model.parameters(), lr=LR, weight_decay=LAMBDA) <font color="green"># L2 normнормализация</font>
RESCHEDULED = True
for i, batch in enumerate(getBatch(BATCH_SIZE, train_data)):

Навигация