---
# System prepended metadata

title: Репорт о способности переобучаться

---

# Репорт о способности переобучаться

## Модель

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