Генериране на молекули с помощта на повтарящи се невронни мрежи

Задълбочено обучение за разбиране на материалните науки

През 2017 г. „дигиталното лекарство“ Spinraza беше пуснато на пазара, след години на разработване на лекарства за лечение на спинална мускулна атрофия (SMA), на цена от $750 000 първоначално и $375 000 годишно след това.

Причината за SMA е проста мутация на гена SMN1 на хромозома 5. Една променена нуклеотидна последователност в екзона на гена SMN1 промени цялата траектория на живота на деца, родени с това заболяване, много от които умират преди край на ранна детска възраст. Въпреки това цената на фармацевтичното лекарство, която много държавни и застрахователни компании отказват да платят, е оставила децата неспособни да получат лечение. Всичко, което лекарството просто прави, е да вземе обратната комплиментна последователност на съседна интронна последователност и да се свърже с нея. Това контролира дали екзонът е включен или не, тъй като интронът кодира логиката на гена. Много други по-традиционни лекарства са също толкова прости, като използват молекулярни единици или съединения, които потискат или спират появата на някакъв вид болестен механизъм. И така, защо процесът на разработване на фармацевтично лекарство е толкова скъп и отнема много време и как можем да променим това?

Традиционното разработване на лекарства работи на два етапа; етапа на откриване и етап на развитие. След като целта или първопричината/механизмът на определено заболяване бъде открита, трябва да идентифицираме съединенията и да проверим дали тези съединения правят нещо, за да спрат или потиснат активността на тези заболявания. За всеки 5000 тествани съединения само едно има първоначални положителни ефектии за тези нямаме фундаментално разбиране за неговата токсичност или други физикохимични характеристики. Това води до дълга и упорита работа, която дава почти никакви резултати. Междувременно милиони хора умират от някои от тези болести. До голяма степен поради това инвестирането в повечето фармацевтични компании е по-малко благоприятно от влагането на спестяванията ви в сметка с висока лихва.

Но как можем да се опитаме да ускорим начина, по който идентифицираме съединения за определени целеви ефекти? Това е мястото, където домейнът на генеративните мрежи нарасна бързо в популярност, за да помогне за генерирането на нови молекули, използвайки мрежи като RNN, в този случай. Целта е да се ускори процесът на етапа на откриване чрез премахване на колкото се може повече от процесите, при които трябва ръчно да тестваме големи количества съединения, за да идентифицираме тези, които действат, чрез дизайн на ново лекарство.

Проект De Novo: Генериране на нови молекули

Целта на моя проект беше да генерирам нови молекули с помощта на повтаряща се невронна мрежа. De novo просто означава да се синтезират нови, сложни молекули от по-прости. Има обаче едно основно предупреждение: не знаем колко полезни са тези молекули или дори тяхната валидност, но в края на тази статия споменах начини, по които мога да разширя този модел, за да направя това. Идеята е да обучите модела да научи модели в низове SMILESтака че генерираният резултат да може да съответства на валидни молекули. SMILES е просто низово представяне на молекула въз основа на структурата и различните компоненти на молекулата и е добро за представяне на молекули по начин, който компютрите разбират.

Тъй като подаваме мрежовия текст като данни, RNN са най-добрата мрежа за генериране на нови SMILES низове. Повечето статии и изследователи препоръчват подобряване на вътрешната архитектура на RNN с помощта на LSTM клетки, по-ефективен и ефективен роднина. Следователно ще използваме RNN с 2 LSTM слоя, обучени върху набор от данни от 100 000 низа SMILES.

Етап 1 — Картографиране

Първият етап от този проект е да се създаде ръководство за картографиране на знаци към цели числа, така че RNN да може да обработва данните и обратно, когато превежда резултатите и изхода обратно в знаци. Трябва да създадем набор от всички уникални символи и да изброим (дефинираме числова стойност за всеки символ) всеки елемент. Низовете на SMILES се състоят от 2 вида символи, които са специални символи като „/“ или „=“, и елементарни символи като „P“, „Si“, „Mg“ и т.н. Ние поставяме тези изброени уникални знаци в уникален речник,

unique_chars = sorted(list(set(raw_text)))
char_to_int = dict((c, i) for i, c in enumerate(unique_chars))
char_to_int.update({-1 : "\n"})

Причината за създаване на съпоставяне за „\n“ е, че представлява нов ред в нашия .txt файл.

Етап 2— Предварителна обработка на данни

След като създадем нашите речници за картографиране на знаци, след това извикваме речника char_to_int, за да преведем всеки знак в набора от данни за низове SMILES в цели числа. Нормализирането работи чрез разделяне на всяка от целочислените стойности на знаците на броя на уникалните знаци в набора от данни. След това използваме NumPy, за да преформатираме входния масив X в 3-измерен масив за [проби, времеви стъпки, физикохимични характеристики], което е очакваният входен формат за повтарящи се модели. Изходната променлива Y е еднократно кодирана, за да генерира нови SMILES след обучение на модела. Еднократното кодиране работи върху целочислени представяния като тези, които току-що направихме, и целочислената кодирана променлива се премахва и се добавя нова двоична променлива за всяка уникална целочислена стойност.

Етап 3— Архитектура на модела

Дизайнът на архитектурата, която изградих, се основава на изследователската статия „Генеративни повтарящи се мрежи за De Novo дизайн на лекарства““ от Gupta et al. Реших да използвам тази архитектура, защото тя дава 97% точност при създаването на валидни низове SMILES и беше доста проста архитектура. Състои се от два LSTM слоя, всеки със скрит вектор на състоянието H, преминаващ през клетка в клетка с предишна информация, която RNN никога не е виждал преди. Повече повтарящи се връзки като тази позволяват на мрежата да разбере много по-сложни зависимости на последователностите SMILES. Използвах също регулиране на отпадане от 0,25 на тези слоеве, последвано от плътен изходен слой, състоящ се от неутронна единица, използваща функцията за активиране на softmax. Softmax е функция, която приема като вход вектор от K реални числа (в нашия случай изходния вектор Y) и го нормализира във вероятностно разпределение, състоящо се от K вероятности. Ако искате да разберете повече за тази функция за активиране, бих препоръчал wiki страницата за „функцията softmax“.

# Create the model (simple 2 layer LSTM)
model = Sequential()
model.add(LSTM(128, input_shape=(X.shape[1], X.shape[2]), return_sequences = True))
model.add(Dropout(0.25))
model.add(LSTM(256, return_sequences = True))
model.add(Dropout(0.25))
model.add(LSTM(512, return_sequences = True))
model.add(Dropout(0.25))
model.add(LSTM(256, return_sequences = True))
model.add(Dropout(0.25))
model.add(LSTM(128))
model.add(Dropout(0.25))
model.add(Dense(Y.shape[1], activation='softmax'))

Чувствайте се свободни да добавите повече слоеве или да промените процента на отпадане, но имайте предвид, че с повече слоеве и неврони в NN (невронната мрежа), колкото по-интензивни изчисления и по-точни стават. Тази мрежа беше обучена на Paperspace Cloud GPU с 30 GB RAM, но все пак обучението отне 3 часа на епоха!

Етап 4— Обучение:

За нашата мрежа използвах категорична кръстосана ентропия като функция на загуба, заедно с оптимизатора на Адам. Използвах набор от данни със 100 000 низа SMILES, но исках да го използвам в максимална полза, без да се налага да чакам 4 дни, така че обучих модела за 10 епохи с размер на партидата 512, от който да се уча. Основното правило тук е да разберете, че повече епохи + по-малки размери на партиди = по-добро разбиране на данните,но с цената на много по-дълго време за обучение. Можем също така да използваме контролни точки,вградена функция в библиотеката Keras, за да запазим напредъка си в обучението и теглата на модела във всяка епоха, за да бъдат прехвърлени или запазени за по-късно. Контролните точки са полезни, когато искаме да тренираме на GPU или Cloud услуга (както направих аз), преди да заредим запазените тежести от обучението на CPU, за да намалим времето за проект.

# Define checkpoints (used to save the weights at each epoch, so that the model doesn't need to be retrained)
filepath="weights-improvement-{epoch:02d}-{loss:.4f}.hdf5"
checkpoint = ModelCheckpoint(filepath, monitor = 'loss', verbose = 1, save_best_only = True, mode = 'min')
callbacks_list = [checkpoint] 
# Fit the model
model.fit(X, Y, epochs = 19, batch_size = 512, callbacks = callbacks_list) 
"""TO TRAIN FROM SAVED CHECKPOINT"""
# Load weights
model.load_weights("weights-improvement-75-1.8144.hdf5") 
# load the model
new_model = load_model ("model.h5") assert_allclose(model.predict(x_train),new_model.predict(x_train), 1e-5) 
# fit the model
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=1, save_best_only=True, mode='min')
callbacks_list = [checkpoint]new_model.fit(x_train, y_train, epochs = 100, batch_size = 64, callbacks = callbacks_list)

Етап 5 — Генериране на нови молекули:

Генерирането на нови молекули работи доста просто. Първо, зареждаме предварително обучените тегла, така че да избегнем необходимостта да обучаваме модела всеки път, преди да генерираме нови низове SMILES. След това произволно избираме низ SMILES от набора от данни като референтен низ и генерираме определен брой знаци в диапазона и преобразуваме целочислените стойности обратно в знаци. Кодът по-горе технически може да се използва за генериране на всякакъв вид текст, независимо дали става въпрос за истории, музика или молекули SMILES. В зависимост от персонализираните настройки, скоростта на обучение, размера и качеството на набора от данни, резултатите ще варират, но в края трябва да получим низ, който представлява нещо подобно на валидна молекула. Моделът може да започне с генериране на последователност от само един знак (NNNNNN), преди да премине към изучаване на нови подструктури и разклонения, открити в молекулите (N1CCN(CC1)C(C(F)=C2…).

Ето 2-d за молекулярната структура (O1C=C[C@H]([C@H]1O2)c3c2cc(OC)c4c3OC(=O)C5=C4CCC(=O)5) Генерирах:

и 3-d структурата:
O1C=C[C@H]([C@H]1O2)c3c2cc(OC)c4c3OC(=O)C5=C4CCC(=O)5

Възможни подобрения

  1. Проверка на валидността на тези молекули:Не знаем дали генерираните от нас молекули имат някакъв случай на употреба или дори са валидни молекулярни структури. Ще трябва да потвърдим тези молекули, като ги сравним с оригиналните молекули, използвани за обучение. Чрез изчисляване на техните общи физикохимични характеристики за данните и използване на анализ на основните компоненти на характеристиките на данните за обучение, можем да определим дали новосъздадените молекули са трансформирани по съответния начин.
  2. Дали SMILES низовете дори са най-оптималния начин за представяне на молекули?:LSTM в най-добрия случай имат ограничение за това колко убедително може да направи извадка от генериран текст да изглежда, тъй като SMILES низовете са само елементарен начин за разглеждане на химичния състав на молекула. Вероятно ще създадем по-добри начини за представяне на тънкостите на молекулите за по-точно тестване в бъдеще. Засега обаче SMILES Strings и RNN са стандарт за генериране на молекули с помощта на ML.
  3. Наборът от данни: Чрез увеличаване на даннитеможем да вземем пермутациите или различните подредби на низовете на SMILES и да ги добавим към нашия набор от данни. Друг начин за разширяване на набора от данни е чрез изброяване на низовете SMILES извън оригиналната им форма или чрез записване по друг начин.

Промяна на откриването на лекарства: Откриване на лекарства на базата на фрагменти (FBDD)

Един от основните случаи на използване на този метод за генериране на молекули е откриване на лекарства на базата на фрагменти или FBDD. Това е мястото, където вместо да започнем въвеждането със сентинела (специална стойност или знак, който използва присъствието си като условие за прекратяване), можем да започнем от фрагмент, за който е известно, че се свързва с целевия механизъм на болестта, който представлява интерес. Като вземем низа SMILES на този фрагмент като вход, можем буквално да „отгледаме“ останалата част от молекулата с RNN, създавайки молекули, за които е по-доказано, че работят в противодействието на определена функция! Този метод със сигурност има много обещания и ще бъде интересно да видим да се използва повече в бъдеще.

Заключение + ключови изводи

RNN осигуряват прост, но ефективен начин за генериране на молекули, като се използват само няколко параметъра в солиден набор от данни. Повечето изследвания в космоса се стремят да комбинират архитектури като RL или състезателно обучение, за да помогнат за увеличаване на броя на генерираните валидни молекули или да насочат модела към създаване на молекули с определени свойства за специализирани лекарства. Надяваме се, че в бъдеще с този подход откриването на лекарства на базата на фрагменти ще стане по-често срещано и ще помогне да се направи разработването на лекарства по-жизнеспособно и икономично. AI е ключът към премахването на догадките при създаването на терапии.

Ключови изводи

  • Бавното и скъпоструващо разработване на лекарства и научните изследвания в областта на материалите са пряк резултат от бавния темп на настоящите методи
  • Използвайки M.L, можем да увеличим темпото, с което се извършва научноизследователска и развойна дейност.
  • Най-ефективното използване на ML за генериране на молекули е използването на RNN и SMILES молекулярни низови представяния, но те не са най-оптималният начин за това.
  • Имаме да извървим дълъг път, преди да можем да създаваме по-точни и ефективни молекулярни структури с по-бързи темпове, използвайки AI, но има толкова много да очакваме!

Следващи стъпки

Ако ви хареса тази статия, не забравяйте да следвате тези стъпки, за да поддържате връзка с моите бъдещи проекти и статии!

  1. Свържете се с мен в Linkedin, за да чуете за моите бъдещи разработки и бъдещи проекти. В момента разглеждам cfDNA и идентифицирам уникални биомаркери за ранна диагностика на рак.
  2. Моят уебсайт вече е готов с цялото ми съдържание, както и с моя Github.
  3. Не забравяйте да се абонирате за моя месечен бюлетин, за да виждате нови проекти, конференции, на които ходя, и статии, които публикувам!
  4. Чувствайте се свободни да ми пишете на [email protected], за да говорим за този проект и още!