# Репорт о способности переобучаться
## Модель
Для тренировки использована 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 и тремя шагами.
### Тренировочная выборка

### Тестовая выборка

### Процесс обучения





Можно заметить, что обучение проходит успешно с точки зрения параметра loss, однако, его уменьшение не приводит к общему улучшению точности (accuracy и recall), которые незначительно, но убывают.
## Визуализация
### [оранжевый] автор (34)
При исходном описании стиля кода данного автора были выделены такие свойства его кода, как вызов `__main__` через `if` вконце фала, а так же использование `venv`, о котором говорит первый комметнарий.

Как можно заметить из визуализации выше, модель действительно обращает значительное внимание на эти стилистические элементы. Однако, есть и другие элементы, на которые обращает внимание модель. Скорее всего, это внимание модели можно объяснить тем, что один автор может отправлять схожие файлы для решения одной и той же задачи и эти файлы различаются незначительно.
Стоит обратить внимание на то, что файлы данного автора расположены досотаточно кучно на визувлизации, т.е. этот стиль достаточно уникален.
### [зелёный] автор (23)
Особенностью этого автора ранее было названо использование метода `main` для запуска программы.


Cтоит заметить, что особенность не единственная среди того, на что обращает внимание модель.
### [красный] автор (39)
Этот программист подписывал свои файлы `david` или `Daviv`. Можно заметить, что модель не всегда обращает внимание на имя автора, а больше фокусируется на дате создания, а также то, что модель не всегда обращает внимание на первый комментарий.
Однако, это не мешает модели достаточно точно определять этого автора (исходя из визуализации).

### [фиолетовый] автор (53)
У этого автора имеется характерная подпись, на которую модель обращает много мнимания, так же, как и на использование `if __name__=='__main__'`, что соответствует описанию стиля этого автора на естественном язвке.

### [коричневый] автрор (40)
У этого автора отличительной чертоя является использование virtual environment, о чём говорит первая строчка его кода. Модель тоже обратила на это внимание.

### [синий] автор
Подсватка кода моделью позволила обратить внимание на то, что произвольно выбранный автор не так-то прост. Его стиль кода тоже имеет особенности: он пишет в camel-cas-е, что не типично для языка программирования python.


Как можно заметить, модель обращает вримание на название переменных, и большая часть её фокуса относится к той части слова, которая пишется с заглавной буквы.
Однако, авторы не всегода style-consistent в своём коде. Возмоджно, участник участвовал в контесте несколько лет подряд, возможно, он нашёл где-то готовое решение, но не во всех его файлах использован camel-case:

В этом случае модель обращает внимание на детали, которые для стиля кода значат мало: операции присваивания, сравнения или вывод. Возможно, таким образом модель пытается "заучить" файл с инородной стилистикой.
## Выводы
1. Переобучить модель точно можно
2. Модель способна фокусироваться на те же дели, что и человек
## Дальнейшие действия
1. Повторить то же самое со свёрточной моделью (`conv2d`)
2. Попробовать перестроить архитектуры моделей
3. Обучить модели на меньшем количестве данных