3D프린터의 DIY킷 자체 업그레이드에 대한 영상을 보았다. 영상의 내용은 보급형으로 값싸게 구매할 수 있는 3D프린터(DIY킷)를 이용해 에드온 처럼 부품을 프린팅하여 3D프린터 자신에게 다시 재조립 하는 것이다. 이 재조립을 통해 얻는 것은 바로 '성능의 개선, 성능의 향상, 정밀도 향상' 등 이로운 효과들.


이것을 보며 문득 한가지가 생각났다. '자기 자신을 사용해 스스로를 향상 시키는 것' 이것이 프로그램 분야도 가능하지 않을까? 라는 생각이었다. 기발한 생각이라고 생각했건만 그다지 기발하진 않았던 것 같다. 구글을 검색해보니 이미 이러한 생각을 한 사람이 여럿있었다.


그 중에서 이와 연관된 '프로그램이 프로그래밍을 하는 것' 에 대한 좋은 게시글이 있어서 스크랩을 했다. 2017년 3월에 작성된 게시글임에도 2018년 후반기에 접어들고 있는 현재 완성되지 않은 영역이다. 프로그래머로써 인공지능이 프로그래밍을 하는 시대가 온다면 도태되는 것을 느끼겠지만, 그와 상반적으로 반복적이고 지루한 코딩을 벗어나 창의력을 요구하는 부분을 계획, 입력 할 수 있게될 것이 주가 되는 것을 느낄 수 있지 않을까 생각한다. 


아래는 스크랩 글의 본문이다. 깔끔하게 정리되어있고 좋은 자료들을 제시하므로 관심이 있다면 읽어보는 것을 추천한다.



스스로 코딩을 하는 인공지능의 현 주소-Deepcoder


프로그래밍의 영역은 바로 인공지능 자체를 만드는 영역인 만큼, 기계와 인간과의 경쟁에서 인간 최후의 보루로 여겨지곤 합니다.


이렇게 원하는 프로그램의 코드를 자동으로 생성하는 소프트웨어의 개발 시도가 과거에 없었던 것은 아닙니다. Program Synthesis라는 이 분야는 기존에도 이미 많은 연구가 진행되어 온 컴퓨터공학 분야로, 연역적인 방법이 아닌 인공지능 기법이 적용되기 시작한 것은 최근입니다.



이 중, 인공지능 기법인 RNN(Recurrent Neural Network)을 적용하여 꽤 인상적인 결과를 낸 소프트웨어 DeepCoder가 등장했습니다. 이 소프트웨어는 마이크로소프트 연구소와 케임브리지 대학교에서 공동개발한 것으로 현재 유명 인공지능 학회인 ICLR(International Conference on Learning Representations) 2017의 심사를 대기 중입니다. 논문은 이 링크에서 직접 읽어볼 수 있습니다.


DeepCoder에서는 먼저 Program Synthesis 문제를 적용하기 위한 특수한 언어를 정의합니다. 이는 컴퓨터 공학 연구에서 흔히 쓰는 방법인데요, 실제 프로그램 개발에서 사용하는 언어는 워낙 복합적이다 보니, 문제 정의 자체가 매우 복잡해지고 계산량이 많아집니다. 그렇기 때문에 연구에서 사용하기 위한, 비교적 적은 영역에서만 구현을 해놓은 Domain Specific Language(DSL)을 정의하여 사용합니다. 이 논문에서는 정수형 변수와 배열만을 변수의 값으로 갖는 언어로 DSL을 제한합니다. 다음 예제를 보면 쉽게 이해할 수 있을 겁니다.


DeepCoder에서 정의한 DSL(Domain Specific Language)로 작성한 프로그램의 예제(논문 발췌)


이렇게 정의한 DSL에서 DeepCoder은 원하는 프로그램 입력값과 출력값의 쌍에 맞는 코드를 찾아냅니다. 예를 들어 [4, 6, 8]이라는 배열에 대해서 [22, 16, 10]이라는 결과를 프로그램을 출력하고 싶을 때, ‘각 인자에 3씩 곱하고 2를 뺀 뒤 배열의 순서를 뒤집는’ 코드를 찾아내는 방식입니다. 이때 프로그램으로서 가능한 모든 코드의 집합을 Program Space라고 합니다. 예를 들어 정의한 DSL이 3개의 함수만 사용하고, 코드의 줄 수는 5줄로 제한을 한다면 대략 가능한 코드의 경우의 수는 3^5인 81가지일 것이고, 이 81가지가 Program Space를 구성합니다.


많은 Program Synthesis 연구가 이 Program Space에서 특수한 검색 알고리즘을 통해 원하는 코드를 찾아내는 방식을 사용합니다. 이 논문에서도 마찬가지로 기존의 여러 검색 방식을 사용하는데, 방대한 Program Space에서 더 빠르게 원하는 코드를 찾기 위해 바로 딥러닝 기법 중 하나인 RNN(Recurrent Neural Network)를 적용합니다. 이 RNN은 이미 알려진 프로그램들로부터, 입력에 대해 출력하는 값으로부터 그 프로그램의 성질을 유추할 수 있도록 훈련됩니다. 이 프로그램의 성질로는 특정 함수의 사용 여부나 반복문의 개수 등이 있을 수 있습니다. 검색 알고리즘들은 훈련된 프로그램 성질 결과를 바탕으로 우선순위를 정해 검색에 활용하게 됩니다.


인공신경망으로 훈련을 한 결과 코드에서 각 함수가 나타날 확률을 예상할 수 있게 됩니다.(논문 발췌)


이렇게 인공신경망을 통해 훈련을 시키면, 우선순위가 높은 후보가 실제로도 원하는 결과값을 줄 확률이 매우 높아지기 때문에, 훨씬 더 빠른 방법으로 Program Synthesis를 할 수 있는 것입니다. 논문에 따르면 5줄 코드에 대해서 이 방법을 적용했을 때, 기존 방법보다 과제 수행 속도가 최대 907배까지 빨라지게 됩니다.


코드가 5줄일 때 기존 방법에 비해 RNN을 적용한 Deepcoder의 성능 향상(DFS, Enumeration, λ^2은 RNN을 적용한 검색 알고리즘)


아직까지 DeepCoder의 성능이나 적용 범위에는 많은 한계가 있습니다. 대표적으로 논문에서 채택한 방법이 앞서 설명한 매우 간단하게 정의된 DSL에서만 적용된 것이기 때문에, 이것보다 훨씬 복잡한 실제 언어에 이 방법을 적용하기에는 더 많은 노력이 필요합니다. 실제로 인공지능 기법을 사용하지 않은 전통적인 Programming Synthesis 분야에서도 실제 언어에서의 연구 성과는 아직 많이 미미한 상태라서, 실용적인 수준으로 발전하기 까지는 아직 많은 시간이 걸릴 것으로 보입니다.


코드의 줄 수 자체도 Program Space가 방대해지는 것을 막기 위해 5줄로만 제한을 했기 때문에 인공신경망 훈련에 큰 시간이 소요되지 않았지만, 코드의 줄에 따라 Program Space가 기하급수적으로 커지기 때문에, 실용적인 경우에 있어서는 인공신경망을 적용하는 것에도 큰 버거움이 따를 것입니다.


하지만, DeepCoder는 인공 신경망을 Program Synthesis 영역에 적용했을 때 성능이 크게 향상될 수 있는 가능성을 처음으로 보여주었습니다. 또, 기존의 여타 다른 연구 성과와는 달리 어떤 프로그램이나 언어에 대해서도 일관되게 인공지능을 도입할 수 있는 ‘일반적인 방법론’을 제시했다는 측면에서도 큰 의의가 있는 것 같습니다.


궁극적으로, 저자 중 한 명인 Marc Brockschmidt에 따르면 DeepCoder의 성과가 더욱 발전하면 코딩을 모르는 사람도 원하는 기능을 설명하면 프로그램이 자동으로 완성되게끔 시스템을 구성할 것이라고 합니다.


MIT 교수 Armando Solar-Lezama은 “이런 종류의 기술이 제안하는 자동화는 잠재적으로 프로그램 개발에 엄청난 생산성 향상을 불러올 수 있다”고 내다보고 있습니다. 그는 아무리 Program Synthesis가 발전한다고 해도, 개발 영역에서 많은 부분을 차지하는 반복적이고 지루한 작업들을 대체하지, 섬세한 고난이도의 작업은 대체하기 힘들 것이라고 보고 있습니다. 또한 그는 한번에 긴 코드를 ‘짠’하고 내놓는 것은 비현실적으로 보일 수도 있지만, 실제로 긴 코드 자체도 작은 여러 조각의 코드가 합쳐진 것이기 때문에 Deepcoder의 접근법이 옳은 뱡향이라는 것을 시사했습니다.


Programming Synthesis 분야는 80년대 초반까지만 해도 왕성히 연구가 펼쳐졌던 분야였다고 합니다. 하지만 당시 대부분의 연구 결과가 확장되어 적용되는 데에 실패하면서, 이 분야에 대한 흥미는 많이 약해져 갔습니다. 인공지능 기법이 최근 파급력을 가져오면서, Deepcoder을 비롯해 이 분야에도 인공지능을 적용해보는 시도가 다시 이루어지고 있습니다. (Deepcoder 논문의 서문에 몇몇 연구가 소개되어 있음)


인공지능에 힘입어 이 분야가 다시 추진력을 얻을 수 있을지, 그리고 Deepcoder가 그 성과를 주도할 수 있을지 매우 흥미진진합니다. 이와는 별개로, 독자 분들이 이 글에 들어온 첫 순간부터 궁금했을 법한 ‘인공지능이 개발자의 영역도 대체할 수 있을까?’라는 질문에 대해서는, ‘아직은 대체할 수 있다는 정량적 근거가 거의 없다’라는 대답을 해볼 수 있을 것 같습니다. 정량적 근거는 없지만, Deepcoder를 비롯한 Program Synthesis 분야의 발전을 기대해봅니다.


참고기사

New Scientist, “AI learns to write its own code by stealing from other programs


해당 게시글에 대한 출처

http://etinow.me/187 [에티 ETI] - '제이초이'님의 작성글입니다.

'FreeNote' 카테고리의 다른 글

지친 하루엔 역시 Lofi hip hop  (0) 2018.09.06
T스토리 주물럭  (0) 2018.08.19
블로그 이미지

irostub

iro의 잡화상점

,

몇가지 배웠던거 짬뽕해서 날림으로 작성해봤다.

뭐 무슨 컵에 뭐 넣고 무슨 컵에 뭐 넣고 출력하는 것인데, 연산까지 넣기엔 이미 졸려버릴 시간이라...나~중에 주말에나 볼만하도록 할 수 있겠다.


#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{
	bool mainSwitch = false;

	int cup = 0;
	float water = 0.0f;

	char cup1_Name[50] = "";
	string inputS;
	string cup2_Name = "";

	cout << "컵을 실행하시겠습니까? (yes or no)";
	cin >> inputS;

	while (true)
	{
		if (inputS == "no")
		{
			cout << "프로그램을 종료합니다." << endl;
			break;
		}
		else if (inputS == "yes")
		{
			mainSwitch = true;

			while (mainSwitch)
			{
				cout << "첫번째 컵에 무엇을 얼마나 따릅니까? (스페이스바로 입력구분)" << endl;
				cin >> cup1_Name >> water;

				cout << "두번째 컵에 무엇을 얼마나 따릅니까? (스페이스바로 입력구분)" << endl;
				cin >> cup2_Name >> cup;

				cout << "각 컵에 들어간 액체의 종류와 g(gram)수" << endl;
				cout << cup1_Name << " : " << water << "g" << endl;
				cout << cup2_Name << " : " << cup << "g" << endl;

				string outi = "";
				cout << "프로그램을 종료하려면 yes를 계속하시려면 no를 입력해주세요. ";
				cin >> outi;
				if (outi == "yes")
				{
					mainSwitch = false;
					inputS = "no";
				}
			}
		}
		else
		{
			cout << "잘못 입력하셨습니다. yes or no 로 대답해주십시오." << endl;
		}
	}
}


블로그 이미지

irostub

iro의 잡화상점

,

자료형 수업과 같이 나온 예제. 시프트 연산이 나오지 않는 이상 기본적인 5칙연산자에선 어려운 부분이 별로 없기에 간단했던 코딩.


예제2) 물건을 사고 남은 잔돈을 500원, 100원, 10원 단위로 분류하여라


#include "stdafx.h"
#include <iostream>
using namespace  std;

int main()
{
	int getCoin = 0;
	int sellCoin = 0;
	int haveCoin = 0;

	int count = 0;

	cout << "현재 소지금을 입력하세요 : ";
	cin >> getCoin;
	cout << "구입 금액을 입력하세요 : ";
	cin >> sellCoin;

	haveCoin = getCoin - sellCoin;

	count = haveCoin / 500;
	haveCoin %= 500;

	cout << "500원 : " << count << " 개"<<endl;
	count = 0;
	
	count = haveCoin / 100;
	haveCoin %= 100;

	cout << "100원 : " << count << " 개" << endl;
	count = 0;
	
	count = haveCoin / 10;
	haveCoin %= 10;

	cout << "10원 : " << count << " 개" << endl;

	return 0;

}


이것 또한 약간의 차이가 있었는데, 동전의 단위마다 카운터를 올릴 변수를 모두 선언한 방식과 그냥 카운터 변수 하나를 계속 0으로 초기화 해가며 출력한 방식 정도가 달랐다. 큰 문제가 없으므로 ~~

블로그 이미지

irostub

iro의 잡화상점

,

오늘 강의에서 실습한 예제. 다양한 자료형을 입력받고 수순대로 출력하는 간단한 코딩이다.


예제1) 자료형에 맞게 입력을 받고 출력하시오.


#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

int main()
{
	char name[100] = "";
	short cc = 0;
	float weight = 0;
	//char engineT[2] = "";
	string engine = "";

	cout << "차종을 입력하세요 :";
	cin >> name;
	cout << "배기량을 입력하세요 :";
	cin >> cc;
	cout << "중량을 입력하세요 :";
	cin >> weight;
	cout << "연료 타입을 입력하세요 (a. 휘발류, b. 경유) :";
	cin >> engine;

	if (engine == "a")
	{
		cout << name << "/" << cc << "/" << weight << "/" << "휘발류"<<endl;
	}
	else
	{
		cout << name << "/" << cc << " CC /" << weight << " Ton /" << "경유" << endl;
	}

	return 0;
}


교수님이 작성한 답안과 약간의 차이가 있었지만, string과 C-string의 차이이므로 큰 문제는 없다.

블로그 이미지

irostub

iro의 잡화상점

,

ProjectZip

Programing/C# 2018. 9. 6. 23:53

일단 특정 폴더를 압축해서 지정된 경로에 압축화일이 생성되는 것 까지 성공했다.


메인이 되는 기능은


자동으로 응용프로그램의 시작을 감지하여 ProjectZip이 프로세스에 올라간다. 응용프로그램의 종료를 자동감지하여 응용프로그램의 작업영역(예를들면 Visual Studio)의 소스들을 모조리 압축한 뒤 지정된 경로에 업로드 시키고 ProjectZip이 프로세스에서 중지된다.


현재 구글의 클라우드 서비스가 클라우드 폴더에 저장하면 자신의 구글 클라우드를 사용하는 모든 플랫폼에 자동으로 동기화가 되는 시스템을 활용하여 ProjectZip이 Path를 자동으로 서치하도록 할 생각.


이후 업데이트 시 추가해야 할 사항들은


.Zip 확장자 외에도 대표적으로 많이 쓰이는 확장자들 .7z, .alz, .egg 등을 지원하도록 만들 생각.


Visual Studio2017을 사용하던 중에 생각이 났다. 집에서 PC로 작업하던 작업물이 휴대용 노트북과 태블릿에서 같은 프로젝트를 사용하기 위해선 왜 메일을 이용하여 주고받거나 USB를 이용해야하는가. 그냥 Visual Studio2017의 불러오기 경로가 저장이 된다는 점을 감안하면 클라우드 폴더를 VS2017경로로 지정해두고 자동으로 백업해주는 시스템을 만들면되지않는가! 라는 생각이 말이다.


하여간, 일단 메인기능 중에 실행중인 프로세스를 읽어오는 것을 어떻게 해야할 것인지 고민해보고 이것이 모두 해결되면 배포판으로 업로딩을 해봐야겠다.


PS. 지금 당장드는 생각은 아무래도 ProjectZip은 Windows시작시에 트레이로 상주하는 형태이거나, 적어도 인스톨파일로 VS2017의 애드온 형식으로 작동하게되지 않을까 생각한다.

블로그 이미지

irostub

iro의 잡화상점

,




<Lofi Hip Hop> 이라는 장르를 알게되었다. 재즈 스타일이 섞인 블루스 비트를 내뿜는 장르인데, 진짜 듣다보면 시간이 지나며 노랗게 바래가는 사진의 모습이 연상되는 아늑한 음악이다.


빗소리와 함께 특히 잘어울리면서 안정감을 주는데는 이 장르의 노래들이 최고인 것 같다. 물론 클래식, 재즈, 블루스, 여타 많은 안정적이고 귀가 즐거운 음악들도 좋지만, 심신의 안정감(?)에선 이 장르는 타의추종을 불허하는 듯.


꽤나 매니아들도 많고 찾는 소비자도 많아서인지 Youtube에도 Lofi Hip Hop이라고 검색해주면 수 많은 라디오 채널이 등장한다.


추천해준 Kian에게 고마울 따름.


네 음악 취향과 내가 비슷해서 내 인생이 음악으로 풍족할 수 있어서 고맙다.


아래 링크는 작성자가 자주 듣는 Lofi Hip Hop의 Youtube 채널들


안정적이고 편안~한 카페나, 한국에선 흔히 볼 수 없는 바&카페의 느낌을 듬뿍 느낄 수 있을 것이다! 추천 다섯개 쾅쾅!



https://youtu.be/5AEbq6X33A8

<Mellowbeat Seeker의 24/7 lofi hip hop radio - beats to chill/study/relax 채널>

 

https://youtu.be/hHW1oY26kxQ

<ChilledCow의 lofi hip hop radio - beats to relax/study to 채널>


https://youtu.be/7sT0pr51ZAw

<the bootleg boy2의 Smoke & Study - lofi hip hop radio 채널>

블로그 이미지

irostub

iro의 잡화상점

,

페이지에 글을 코딩글을 게시할 때 엄청나게 가독성이 좋아지고 깔끔해지는 기능.


넣는 방법도 별 어렵지 않으니 코딩글을 게시하는 분들은 적용해보는 것을 강력추천!


(HTML을 배우지않으신 분도 충분히 적용가능합니다)


어떻게 변하는지는 비포에프터 이미지로 한방에..


<↑이렇던 친구가.....> - Before


<↑이렇게 변했습니다! 혁명이에요!> - After


자! 그럼 바로 적용해보도록합시다.


https://highlightjs.org/

해당 링크에서 Get version을 클릭하여 압축파일을 받고 바로 압축을 해제해 줍시다.



압축을 해제한 폴더(highlight)의 highlight.pack.js가 필요하고


styles폴더에서 원하는 코드 스타일을 고릅니다. 코드 스타일을 미리보는 방법

https://highlightjs.org/static/demo/ 


해당 링크에서 Styles 카테고리를 눌러보시면서 미리 볼 수 있습니다.

미리 본 스타일의 이름과 styles폴더 안에 이름이 같은 css파일이 필요합니다.


두 가지를 잘 준비하셨다면 이제 티스토리에 적용을 해보아야겠지요?



티스토리 관리 - 꾸미기 - 스킨 편집으로 들어가줍니다.




먼저 오른쪽 상단에 파일업로드에서 아까 준비한 두가지 highlight.pack.js와


미리 본 스타일의 이름과 styles폴더 안에 이름이 같은 css파일을 업로드!!


업로드가 다 되었다면 파일업로드 왼쪽 끝에있는 HTML 탭으로 갑니다. 



HTML코드를 보시면 </head>가 있습니다. 이 줄의 바로 위에 아래의 코드를 복사해서 넣어줍니다.

<link rel="stylesheet" href="./images/default.css">
<script src="./images/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>

그리고 저 코드에서 default 라고 되어있는 부분을 아까 미리 봐둔 스타일의 파일 이름으로 수정해줍니다(골라두신 CSS파일 이름과 같으면됩니다). 


적용이 끝났습니다. 이제 사용하는 방법을 알아볼까요? 어렵지않습니다.


글쓰기를 가신 뒤 HTML체크 박스를 체크해주면 HTML작성으로 변경됩니다.


이렇게 작성하시면됩니다.


<pre><code>이 사이에 코드를 집어넣읍시다.</code></pre>


적용해보시면 정돈된 코드의 모습을 보실 수 있을 것입니다. 


그리고 단, 한가지의 단점이 있습니다. 


C++을 예로들면 #include <iostream> 코드가 들어갈 때, '<', '>' 이녀석들이 출력되지않습니다


글씨로 인식하는 것이 아니라 태그로 인식해서인데요. 


해결방법은 간단합니다. '<' 이녀석을 &lt; 이걸로 대체해서 써줍시다. 그러면 해결!

블로그 이미지

irostub

iro의 잡화상점

,

예제 3)km를 mile로 환산


다른 환산 로직과 별다를 것은 없다. 반복학습의 일환.


확실히 작성하면서 느끼는데, 개인적으로 묵시적 형 변환보단 명시적 형 변환이 더 깔끔하다고 느껴진다.

#include "stdafx.h"
#include <iostream>
using namespace std;

int main()
{
	int km = 0;
	float mile = 0;

	cout << "km값을 입력하세요 : ";
	cin >> km;

	mile = (float)km * 0.62f;

	cout << km << "km는 " << mile << "mile입니다.";
}



블로그 이미지

irostub

iro의 잡화상점

,