# Репорт о способности переобучаться ## Модель Для тренировки использована embedding-based модель с архитектурой, представленной ниже: ``` Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= embedding (Embedding) (None, 600, 100) 9975700 _________________________________________________________________ layer_normalization (LayerNo (None, 600, 100) 200 _________________________________________________________________ reshape (Reshape) (None, 600, 100, 1) 0 _________________________________________________________________ dropout (Dropout) (None, 600, 100, 1) 0 _________________________________________________________________ conv2d (Conv2D) (None, 600, 100, 1) 401 _________________________________________________________________ conv2d_1 (Conv2D) (None, 600, 100, 1) 401 _________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 1, 100, 1) 0 _________________________________________________________________ reshape_1 (Reshape) (None, 1, 100) 0 _________________________________________________________________ flatten (Flatten) (None, 100) 0 _________________________________________________________________ dense (Dense) (None, 50) 5050 ================================================================= Total params: 9,981,752 Trainable params: 9,981,752 Non-trainable params: 0 _________________________________________________________________ None ``` ## Выбор данных Чтобы проверить, способна ли модель различать людей, нужно было выбрать людей с выделяющимся стилем кода. Для этого были пересмотрены файлы шестидясети человек из GCJ зе пробельных символов. В однострочно представлении кода проще всего фокусироваться на таие элементы, как: - Начало кода (комментарий, тип читки) - Блочные комметнарии (встречаются редко, к сожалению, в питоне) - Общая структура кода. Очень ярко выделяются люди, которые перешли на питон с Jav-ы или плюсов. Они пишут код в одном методе `main()`, таким образом, что эта функция занимает большую часть файла. Важным фактором является тот факт, что у некоторых авторов имя указано прямо в файле, что упрощает работу для модели, однако не все авторы консистентны в этой тенденции (несколько файлов подписаны, несколько - нет). Примеры "подписаных" файлов: ```python '''Createdon12/04/2014@author:david'''#f=open("exampleA.txt")#f=open("A-small-attempt0.in")f=open("A-large.in")T=int(f.readline())P=[]foriinrange(T):p=[int(n)forninf.readline().split()[1]]P.append(p)defsolve(p):f=0a=0forsl,npinenumerate(p):ifsl>a:f+=(sl-a)a+=(sl-a)a+=npreturnffRes=open("res.txt","w")case=0forpinP:print(p)case+=1sol=solve(p)print("Case#{}:{}".format(case,sol))fRes.write("Case#{}:{}\n".format(case,sol))fRes.close() ``` ```python #!/usr/bin/envpython#encoding:utf-8"""AlienLanguage.pyCreatedbyGrahamDennison2009-09-03.Copyright(c)2009__MyCompanyName__.Allrightsreserved."""importsysimportgetopthelp_message='''Thehelpmessagegoeshere.'''classUsage(Exception):def__init__(self,msg):self.msg=msgdefmatches(lst,target):ifnottarget:return1result=0forstring,successorListinlst:ifnotstringintarget[0]:continueresult+=matches(successorList,target[1:])returnresultdefinsertString(lst,stringToInsert):forstring,successorListinlst:ifstringToInsert[0]==string:returninsertString(successorList,stringToInsert[1:])newList=Noneiflen(stringToInsert)>1:newList=[]insertString(newList,stringToInsert[1:])lst.append((stringToInsert[0],newList))root=[]defmain(argv=None):ifargvisNone:argv=sys.argvtry:try:opts,args=getopt.getopt(argv[1:],"ho:v",["help","output="])exceptgetopt.error,msg:raiseUsage(msg)#optionprocessingforoption,valueinopts:ifoption=="-v":verbose=Trueifoptionin("-h","--help"):raiseUsage(help_message)ifoptionin("-o","--output"):output=valueexceptUsage,err:print>>sys.stderr,sys.argv[0].split("/")[-1]+":"+str(err.msg)print>>sys.stderr,"\tforhelpuse--help"return2f=file(args[0])L,D,N=map(int,f.readline().split())foriinxrange(D):insertString(root,f.readline().strip())#printrootforiinxrange(N):line=f.readline().strip()lineList=[]state=0string=''forcharinline:ifchar=='(':state=1ifstring:lineList.extend(string)string=''elifchar==')':state=0lineList.append(list(string))string=''else:string+=charifstring:lineList.extend(string)#printline,lineList,matches(root,lineList)print"Case#%i:%i"%(i+1,matches(root,lineList))if__name__=="__main__":sys.exit(main()) ``` В результате визуального выделения характерых стилистических элемнтов исходного кода было выбрано 6 авторов с очень характерными файлами: 1. **[оранжевый]** Файл начинается с `#!usr/bin/python` + автор использует вызов `if__name__=='__main__':main()` 2. **[зелёный]** Файл представляет из себя большую функцию `main`, которая занимает почти весь файл. Файлы заканчиваются её вызовом: `main()` 3. **[красный]** Файл подписан: `'''Createdon12/04/2014@author:david'''`. Начертание самогг имени встречается как с маленькой буквы, так и с большой 4. **[фиолетовый]** Файл подписан, участник писал соревнование несколько лет подряд, поэтому даты меняются: `#!/usr/bin/envpython#encoding:utf-8"""AlienLanguage.pyCreatedbyGrahamDennison2009-09-03.Copyright(c)2009__MyCompanyName__.Allrightsreserved."""` 5. **[коричневый]** Файл начинается с `usr/bin/python` 6. **[синий]** Среднестатистический автор, никаких особенных стилистических черт не выявлено Итоговый датасет состоит из 526-и файлов. ## Тренировка Модель научилась распознавать этих авторов за две эпохи (для обеих эпох данные генерируются рандлмно, без использования дерева), с размером батча 64 и тремя шагами. ### Тренировочная выборка ![](https://i.imgur.com/QfbUfF1.png) ### Тестовая выборка ![](https://i.imgur.com/oOlG6S6.png) ### Процесс обучения ![](https://i.imgur.com/tIgVYUI.png) ![](https://i.imgur.com/tWSQX5e.png) ![](https://i.imgur.com/Y4eiLu2.png) ![](https://i.imgur.com/wPxdeWd.png) ![](https://i.imgur.com/iTyFDyj.png) Можно заметить, что обучение проходит успешно с точки зрения параметра loss, однако, его уменьшение не приводит к общему улучшению точности (accuracy и recall), которые незначительно, но убывают. ## Визуализация ### [оранжевый] автор (34) При исходном описании стиля кода данного автора были выделены такие свойства его кода, как вызов `__main__` через `if` вконце фала, а так же использование `venv`, о котором говорит первый комметнарий. ![](https://i.imgur.com/KbitHEm.png) Как можно заметить из визуализации выше, модель действительно обращает значительное внимание на эти стилистические элементы. Однако, есть и другие элементы, на которые обращает внимание модель. Скорее всего, это внимание модели можно объяснить тем, что один автор может отправлять схожие файлы для решения одной и той же задачи и эти файлы различаются незначительно. Стоит обратить внимание на то, что файлы данного автора расположены досотаточно кучно на визувлизации, т.е. этот стиль достаточно уникален. ### [зелёный] автор (23) Особенностью этого автора ранее было названо использование метода `main` для запуска программы. ![](https://i.imgur.com/tSR5UZ7.png) ![](https://i.imgur.com/OmIBnJF.png) Cтоит заметить, что особенность не единственная среди того, на что обращает внимание модель. ### [красный] автор (39) Этот программист подписывал свои файлы `david` или `Daviv`. Можно заметить, что модель не всегда обращает внимание на имя автора, а больше фокусируется на дате создания, а также то, что модель не всегда обращает внимание на первый комментарий. Однако, это не мешает модели достаточно точно определять этого автора (исходя из визуализации). ![](https://i.imgur.com/9nthE8K.jpg) ### [фиолетовый] автор (53) У этого автора имеется характерная подпись, на которую модель обращает много мнимания, так же, как и на использование `if __name__=='__main__'`, что соответствует описанию стиля этого автора на естественном язвке. ![](https://i.imgur.com/qoUbs3r.png) ### [коричневый] автрор (40) У этого автора отличительной чертоя является использование virtual environment, о чём говорит первая строчка его кода. Модель тоже обратила на это внимание. ![](https://i.imgur.com/porP3vV.png) ### [синий] автор Подсватка кода моделью позволила обратить внимание на то, что произвольно выбранный автор не так-то прост. Его стиль кода тоже имеет особенности: он пишет в camel-cas-е, что не типично для языка программирования python. ![](https://i.imgur.com/oTtSjnq.png) ![](https://i.imgur.com/PlAN9FF.png) Как можно заметить, модель обращает вримание на название переменных, и большая часть её фокуса относится к той части слова, которая пишется с заглавной буквы. Однако, авторы не всегода style-consistent в своём коде. Возмоджно, участник участвовал в контесте несколько лет подряд, возможно, он нашёл где-то готовое решение, но не во всех его файлах использован camel-case: ![](https://i.imgur.com/QmSWTYN.png) В этом случае модель обращает внимание на детали, которые для стиля кода значат мало: операции присваивания, сравнения или вывод. Возможно, таким образом модель пытается "заучить" файл с инородной стилистикой. ## Выводы 1. Переобучить модель точно можно 2. Модель способна фокусироваться на те же дели, что и человек ## Дальнейшие действия 1. Повторить то же самое со свёрточной моделью (`conv2d`) 2. Попробовать перестроить архитектуры моделей 3. Обучить модели на меньшем количестве данных