Изменения
→Предсказание молекулярных свойств
Первые нейронные сети для предсказания молекулярных свойств использовали Моргановские фингерпринты (англ. Morgan fingerpints), которые для каждого атома в молекуле выделяли всех его соседей на каком-то определенном расстоянии (которое является гиперпараметром) и смотрели на наличие такой подструктуры в молекуле. Получался аналог некоторого оne-hot кодирования. Впоследствии этот метод был несколько усовершенствован, и стали смотреть не на наличие подструктуры, а на то, сколько раз она встречается в молекуле. Прорыв в этой области случился с появлением сети NeuralFingerprints <ref>[https://arxiv.org/abs/1509.09292 Duvenaud et al., Convolutional Networks on Graphs for Learning Molecular Fingerprints, 2015]</ref>.
NeuralFingerprints принимает один гиперпараметр - максимальное расстояние, которое нужно учитывать при просмотре соседей каждого атома. После этого для каждого расстояния для каждого атома суммируются взвешенные суммы атомных представлений атомные представления его соседей на текущем расстоянии. Таким образом, получается векторное представление текущего атома фиксированной длины, которая равна количеству свойств у одного атома. Каждый элемент такого представления умножается на обучаемый параметр, уникальный для номера свойства и текущего рассматриваемого расстояния. После этого применяется функция активации к этому полученному ранее вектору, где также есть весаумноженному на вес, учитывающие каждое из свойств с той или иной интенсивностьюотвечающий за текущее расстояние. Полученные результаты для каждого из атомов на каждом из расстояний суммируются и получается результирующий вектор свойств для молекулы. Таким образом, в этой сети обучаемые параметры {{---}} веса для каждого из свойств атомов на каждом расстоянии (<tex>H^i_j</tex>, где <tex>i</tex> {{---}} индекс номера свойства (в модели их всего 5), <tex>j</tex> {{---}} индекс для текущего расстояния) и веса для каждого из расстояний (<tex>W_j</tex>, где <tex>j</tex> {{---}} индекс для текущего расстояния).Псевдокод представлен ниже. '''function''' neuralFingerptint(molecule, R, H, W): f = array[len(molecule), 0] '''for''' a in molecule: r[a] = g(a) <span style="color:Green"># записываем свойства для каждого атома</span> '''for''' L = 1 to R: '''for''' a in molecule: neighbor_indices = '''neighbors'''(a) <span style="color:Green"># смотрим соседей на расстоянии L от текущего атома a</span> v = r[a] + '''sum'''(r[i] for i in neighbor_indices) <span style="color:Green"># суммируем вектора соседей и вектор текущего атома</span> r[a] = '''σ'''(v <tex>\cdot</tex>H[N][L]) <span style="color:Green"># изменяем представление текущего атома</span> i = '''softmax'''(r[a]<tex>\cdot</tex>W[L]) <span style="color:Green"># получаем вектор для текущего атома и расстояния</span> f = f + i <span style="color:Green"># добавляем его к ответу</span> '''return''' f