반응형

이전 포스팅에서 논리 회로 중 AND 게이트와 퍼셉트론(Perceptron)을 활용하는 방법에 대해 쉽게 설명했다.

아래 포스팅을 참조하면 된다.

2024.12.10 - [인공지능(AI)/딥러닝(DeepLearning)] - [딥러닝]인공지능 초보 개발자면 퍼셉트론과 AND 게이트 활용 방법은 알고 가자, 쉬운 설명.

 

[딥러닝]인공지능 초보 개발자면 퍼셉트론과 AND 게이트 활용 방법은 알고 가자, 쉬운 설명.

음식도 맛있고 양도 많은데 가격까지 저렴하다면 우리는 가성비가 좋다고 표현한다.음식과 가격 둘 다 만족해야 가성비라는 표현을 쓴다.이 중 하나라도 맘에 안들면 가성비가 좋다고 하지 않

tiboy.tistory.com

딥러닝을 공부하는 개발자라면 논리 연산이 AND 외 더 있다는 것을 알고 있다.

NAND, OR 그리고 XOR 게이트가 더 있다.

XOR 게이트는 인공지능에 한 걸음 더 나가가는 특별한 경우라 따로 설명하겠다.

 

AND 게이트와 퍼셉트론 활용에 이어 이번 포스팅은 NAND 게이트와 OR 게이트에 대해 쉽게 설명해 본다.

AI 개발자가 되기 위해  출발해 봅시다.

준비되었나요?

 

NAND 게이트와 퍼셉트론 활용

NAND는 무슨 의미일까?

낸드라고 읽는데 어디서 들어본 듯하다.

"낸드"로 검색하면 반도체 관련 뉴스를 볼 수 있다. 

그 뉴스에서 "낸드플래시"라는 용어를 많이 볼 수 있는데 그 낸드가 NAND다.

NAND는 "Not AND"다.

"Not"이 붙은 의미는 반대라고 생각하자.

AND 게이트의 값을 반대로 출력한다. 

AND 게이트 진리표를 표로 다시 확인해 보자.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

NAND 게이트는 출력값이 반대로 나온다고 했다.

이제 NAND 게이트 진리표를 표로 정리해 보자.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

x1과 x2가 하나 이상 0일 때 AND 게이트는 0이었지만 NAND는 1이다.

x1과 x2가 모두 1일 때 AND 게이트는 1이었지만 NAND는 0이다.

이제 가중치와 임계값을 정해보자.

(w1, w2, 𝞱)0 : x1w1 + x2w2 <= 𝞱 1: x1w1 + x2w2 > 𝞱

AND 게이트와 퍼셉트론에서 봤던 계산식과 기호들이다.

기억을 되살려보자.

w1 = 0.7, w2 = 0.3, 𝞱 = 0.9

AND 게이트의 x1, x2 값 (0, 0)인 경우부터 순서대로 식에 대입해 보자.

0 * 0.7 + 0 * 0.3 = 0 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 0 * 0.3 = 0.7 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

0 * 0.7 + 1 * 0.3 = 0.3 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 1 * 0.3 = 1.0 은 0.9보다 크므로 (>) 1.

위 가중치와 임계값은 AND 게이트용이다.

NAND 출력값은 AND의 반대라고 했다.

위 가중치와 임계값에 마이너스 부호를 붙이면 NAND 게이트를 만족한다.

w1 = -0.7, w2 = -0.3, 𝞱 = -0.9

0 * -0.7 + 0 * -0.3 = 0 은 -0.9 보다 크므로 (>) 1.

1 * -0.7 + 0 * -0.3 = -0.7 은 -0.9 보다 크므로 (>) 1.

0 * -0.7 + 1 * -0.3 = -0.3 은 -0.9 보다 크므로 (>) 1.

1 * -0.7 + 1 * -0.3 = -1.0 은 -0.9보다 작거나 같은 조건이므로 (<=) 0.

 

OR 게이트와 퍼셉트론 활용

이제 OR 게이트도 같은 방식으로 알아보자.

우리말로 "또는, 둘 중 하나"로 해석하면 된다.

둘 중 하나 이상이 true(1) 면 1을 출력한다.

OR 게이트 진리표를 표로 정리해 보자.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

x1과 x2가 둘 중 1개 이상 1일 때 OR는 1이다.

x1과 x2가 모두 0일 때 OR는 0이다.

OR 게이트 입력 매개변수는 다음처럼 설정하면 된다.

w1 = 0.7, w2 = 0.3, 𝞱 = 0.2 는 OR 게이트용 가중치와 임계값이다.

위 가중치와 임계값은 OR 게이트를 만족한다.

0 * 0.7 + 0 * 0.3 = 0 은 0.2 보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 0 * 0.3 = 0.7 은 0.2 보다 크므로 (>) 1.

0 * 0.7 + 1 * 0.3 = 0.3 은 0.2  보다 크므로 (>) 1.

1 * 0.7 + 1 * 0.3 = 1.0 0.2  보다 크므로 (>) 1.

가중치와 임계값을 조정할 수 있다는 것을 알았다.

 

논리 회로, 퍼셉트론 활용을 파이썬으로 구현하는 방법

이론 이야기를 했으니 파이썬을 사용해서 직접 코딩해 보자.

아나콘다(파이썬)가 설치된 VSCode(Visual Studio Code)를 사용했다.

 

AND 게이트 함수 만들기

아래 코드를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
 
def AndGate(x1, x2):
    xn = np.array([x1, x2])
    wn = np.array([0.70.3])
    theta = 0.9
 
    sumData = np.sum(wn*xn)
    if sumData <= theta:
        return 0
    else:
        return 1
    
 
 
print(AndGate(0,0))
print(AndGate(1,0))
print(AndGate(0,1))
print(AndGate(1,1))
cs

1번 라인은 numpy를 import 했다.

numpy 내부 함수 array와 sum을 사용할 것이다.

3번 라인에서 AndGate 함수를 선언했다. x1과 x2를 입력받는다.

4번 라인은 x1, x2를 numpy 내부 array함수에 세팅한다.

5번 라인은 w1, w2 값인 0.7, 0.3을 마찬가지로 내부 array 함수에 세팅한다.

6번은 theta( 𝞱)값을 0.9로 할당했다.

8번 라인은 4, 5번 라인 array 값들의 합을 sum 함수로 계산하고 sumData에 할당한다.

9번~ 12번은 sumData 값이 theta값보다 작거나 같으면(<=) 0 아니면 1을 출력한다.

16번부터 AND 게이트 입력값을 넣으면 같은 결과가 나온다.

결과 ( 0, 0, 0, 1)

NAND 게이트 함수 만들기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
 
def NAND_GATE(x1, x2):
    w1, w2, theta = -0.7-0.3-0.9
    sumData = w1*x1 + w2*x2
    
    if sumData <= theta:
        return 0
    elif sumData > theta:
        return 1
    
 
 
print(NAND_GATE(0,0))
print(NAND_GATE(1,0))
print(NAND_GATE(0,1))
print(NAND_GATE(1,1))
cs

4번 라인에 NAND 게이트 가중치와 임계값을 세팅했다.

결과는 (1, 1, 1, 0)로 NAND 게이트와 일치한다.

 

OR 게이트 함수 만들기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
 
def OrGate(x1, x2):
    xn = np.array([x1, x2])
    wn = np.array([0.70.3])
    theta = 0.2
 
    sumData = np.sum(wn*xn)
    if sumData <= theta:
        return 0
    else:
        return 1
    
 
 
print(OrGate(0,0))
print(OrGate(1,0))
print(OrGate(0,1))
print(OrGate(1,1))
cs

이번 포스팅의 마지막 소스 OR 게이트 구현이다.

OR 게이트 구현을 위해 theta( 𝞱)값에 0.2를 할당했다.

결과는 (0, 1, 1, 1)이다.

 

지금까지 NAND와 OR 게이트를 퍼셉트론에 활용하는 내용을 알아봤다.

해당 부분을 파이썬 코드로 구현도 했다.

딥러닝 다음 편은 XOR 게이트에 대해 알아본다.

XOR 게이트는 약간 다르다.

AI 개발자로 한걸음 더 다가섰다.

끝.

반응형
반응형

안녕하세요. 신기한 연구소입니다.

초보(신입) 개발자인데 코딩만 잘하면 되는 거 아닌가요? 

막상 프로젝트에 투입되니 잘하고 있는 건지도 모르겠어요.

입사 후 선배 개발자들이 저를 답답하게 봐요. 혼나기도 하고 잔소리도 엄청 들어요.

업무 회의에 들어가면 이해가 잘 안되기도 하고 상사가 업무 지시를 내려도 무슨 말인지 잘 모르겠어요.

혹시, 어렵게 신입(초보) 개발자로 취업했는데 이런 경우가 있지 않으신가요?

이런 경우는 반드시 알아야 하는 것도 있고 그래서 미리 준비를 해야 하는 것도 있답니다.

20년 넘게 프로젝트를 해왔고 그 경험을 바탕으로 개발자들이 어떤 것을 알아야 하는지 정리해 봤습니다.

프로 개발자가 되고 싶다면 꼼꼼히 읽어보고 꼭 실천하길 바랍니다.



비전공이었지만 개발자의 꿈을 안고 독학으로 시작해 국비 학원을 수료하고 수십여 통의 이력서를 보내 신입(초보) 개발자로 첫 발을 내 딛은 지가 벌써 20년 하고도 몇 년이 더 흘렀습니다.  개발자로 살아온 그 시간은 정말 재미도 있었고 어려움도 있었지만 잘 마무리가 되고 오류가 해결될 때는 개발자로서 적성에 맞다는 뿌듯함 같은 것이 있었습니다.

그 많은 프로젝트를 하면서 수많은 사람들을 만났고 그 다양함에 즐겁기도 했고 짜증 나는  경우도 종종 있었답니다. 하지만 세상 어디에도 내 맘에 쏙 드는 사람들만 있는 곳은 없었답니다. 그 이유로 그만두거나 이직을 한다면 세상 어디에도 갈 곳이 없다는 의미인 것입니다.

모두가 겪는 이 난감한 상황을 책을 통해서 많이 극복하고 도움을 받았답니다. 개발 전공책이 아닌 다양한 책을 읽었는데 어떻게 책을 통해서 독서를 통해서 개발자로 잘 성장해 왔는지 그 이야기를 해보려고 합니다.

 

1. 개발자에게 가장 필요한 것은 독서, 책을 통해서 지혜를 얻다.

보통 개발자는 개발 관련 책을 많이 읽습니다. 물론 책을 읽지 않고 구글링 (요즘은 chatGPT)으로 궁금한 부분을 해결하는 코더들도 많습니다. 최신 트렌드나 기술에 뒤처지지 않기 위해 낮에 근무가 끝나면 저녁이나 주말에 관련 책을 구매해서 읽고 코딩하는 멋진 개발자들도 많습니다. 

사진: Unsplash 의 Matias North

하지만 개발자는 코딩만 하는 것은 아닙니다. 사실 프로그램을 만드는 것은 누군가 요청에 의해 돈을 받고 만들어 주는 것입니다. 즉, 요구사항도 확인해야 되고 회의도 자주 하는 등 소통 또한 중요하다는 의미입니다. 기술 위주로만 책을 읽고 기술력만 향상한다면 개발자로서 반쪽짜리라 할 수 있습니다. 

고객(현업)은 자신들이 편하게 일할 수 있는 프로그램이 필요합니다. 그래서 개발자에게 돈을 주고 프로그램을 만들어 달라고 요청합니다. 그런데 보통 고객은 프로그램에 대해 전문적으로 아는 경우가 드뭅니다. 이런 경우 개발자들이 전문 기술 위주로 설명을 한다면 고객은 잘 이해하지 못합니다. 그저 "어려운 건가? 잘 만들어 주겠지." 이 정도로 넘어가는 경우가 종종 있답니다. 하지만 이후 개발이 어느 정도 진행되면 서로 다른 생각을 하고 있다는 것을 알게 되고 그게 프로젝트의 발목을 잡게 됩니다.

또한, 전문 지식이 없는 고객의 경우 표현에 한계가 있기에 개발자에게 제대로 설명을 못하는 경우가 있습니다. 그로 인해 서로 말다툼이 일어나기도 하고 개발자는 고객이 무슨 말을 하는지 모르겠다면서 고객과의 대화를 기피하게 됩니다. 그리고 개발자는 본인 마음대로 대충 개발을 하는 경우가 발생하기도 합니다. 물론 테스트 기간에 고객은 이렇게 말합니다.

"이건 내가 원하는 프로그램이 아닌데요"

그때부터 요구사항, 회의록을 뒤져가며 서로 다툼이 발생하게 됩니다. 

이런 경우가 발생하지 않기 위해서는 개발자의 역할이 정말 중요합니다. 고객은 고객입니다. 고객이 없다면 개발자는 혼자 취미로 개발하는 것이기에 직업이 될 수 없겠지요? 앱이나 솔루션을 만들어 판매하더라도 고객이 있어야 합니다. 우리가 열심히 프로그램 공부를 하는 것은 직업적으로 성공도 하고 돈도 벌기 위해서니까요.

이런 문제를 해결하는 방법 중 가장 좋은 것이 독서입니다. 여기서 독서는 책을 읽는 것인데 책이 전문 개발 서적을 의미하는 것이 아닙니다. 물론 개발 방법론이나 알고리즘도 중요한 읽을거리지만 고객과의 소통을 위해서는 다른 책을 읽어야 합니다.

어떤 책을 읽어야 할까요?

다양한 책들을 읽어야 합니다. 예를 들어 볼까요?

우선 추천하는 분류는 마케팅 책입니다. 개발자가 마케팅 책을 왜 읽어야 할까요? 그 책에는 고객의 마음을 읽고 고객이 원하는 것을 알아내는데 최적화된 내용들이 있습니다. 고객의 마음을 얻는 것이 개발자에게 엄청 중요합니다.

고객의 정확한 요구를 알아낼 수 있고, 어려운 상황이 발생했을 때 효율적인 제안을 통해 도움을 받을 수도 있습니다. 또한 고객은 자기들의 어려움, 필요한 것을 해결해 줄 거라는 믿음을 갖게 되므로 이런 능력이 있는 개발자가 필요하게 되는 것입니다. 심지어 입사 권유를 하는 고객들도 있답니다. 반대로 이야기하면 기존에 개발자들 때문에 많이 힘들었던 고객들이라면 자신들을 이해해 주고 소통이 더 잘되는 개발자를 원하게 된다는 겁니다.

심리학 책도 추천합니다. 고객도 사람이고 개발자도 사람입니다. 심리학 책을 읽다 보면 고객들의 마음을 더 쉽게 이해할 수 있게 됩니다. 물론 나쁜 의도로 그들의 마음을 이용하면 안 됩니다. 심리학 책을 읽는다고 심리학자처럼 된다거나 최면을 걸 수 있는 것은 아닙니다. 심리학 책을 읽으면 내 마음도 정리가 되고 스트레스 해소에 도움이 되기도 합니다.  고객이 어떤 어려움이 있고 그들의 스트레스는 무엇인지 조금이나마 알 수 있게 되면서 그들에게 어떻게 도움을 줄 수 있을지 준비할 수 있는 능력을 키울 수 있습니다. 

보통 이렇게 고객들과 잘 지내고 칭찬받는 개발자들은 아마 독서를 많이 하고 있을 겁니다. 책을 통해서 여러분은 능력 있고 인기 있는 개발자로 성장할 수 있게 된다는 의미입니다.

독서의 소중함을 알았다면 빨리 책을 찾아보세요. 삼국지에서도 여러분은 개발자로의 삶에서 길을 찾을 수 있을 겁니다.

 

2. 개발자에게 시간 관리는 필수템이다.

개발자에게 시간은 정말 소중합니다. 물론 개발자뿐만 아니라 시간은 모두에게 소중합니다. 특히 시간 관리는 개발자라면 철저하게 관리해야 하는 템입니다.

사진: Unsplash 의 Kevin Ku

여러분들은 출퇴근 시간을 어떻게 보내고 있나요? 피곤함에 잠을 잘 수도 있고 무한 스크롤링하는 SNS나 숏 영상을 시청하기도 합니다. 

퇴근 후에는 지인과 한 잔의 술로 하루의 스트레스를 해소할 수도 있고 드라마나 영화를 보면서 저녁을 먹기도 합니다. 또는 늦은 시간까지 게임을 하기도 하겠지요.

주말이나 휴일 또한 밀린 잠을 잘 수도 있고 여기저기 놀러 가기도 하며 친구들과 술을 마시며 새벽까지 놀기도 합니다.

모든 개발자가 그러진 않겠지만 출퇴근 시간이나 사무실에서 개발자들의 이야기를 들으면 대부분 비슷한 방식으로 시간을 보냅니다. 

일전에 고속도로 휴게소 화장실에서 읽은 문구입니다. 이름이 기억나진 않지만 엄청 유명한 고령의 피아니스트 이야기였습니다. 그는 고령의 나이와 엄청난 피아노 실력이 있음에도 매일 아침 피아노를 친다고 합니다. 왜 그렇게 매일같이 열심히 피아노를 치는가? 이제 그 정도 실력이면 그렇게 안 해도 되지 않냐는 질문에 이렇게 대답했다고 합니다.

"나는 매일 아침 피아노를 칠 때마다 실력이 더 나아지고 있다는 것을 느낍니다"

우리도 매일 우리를 갈고닦아야 합니다. 우리는 직업인입니다. 개발자입니다. 

기술과 소통의 능력을 키우기 위해서는 시간을 잘 활용해서 우리 자신에게 투자해야 합니다. 

열심히 하려는 후배 개발자들을 만나면 이런 이야기를 해줍니다.

"고3 때처럼 열심히 해"

 

3. 개발자에게 관계는 성공적인 프로젝트 완수를 위해 필요하다.

공통 개발자에게 개발 요청을 한 적이 있습니다.

"이걸 내가 왜 하나요?"

사진: Unsplash 의 Priscilla Du Preez 🇨🇦

유지보수 사이트에서 몇 번 번복된 일을 요청한 적이 있었습니다.

"이랬다 저랬다 하지 말고 한 번에 정리해서 최종만 주세요"

일정이 급한 프로젝트에서 이런 경우도 있었습니다.

"주신 문서로 개발하기 어렵습니다"

"나는 개발 다 했고 문서까지 만들어 줬으니 알아서 하세요"

 

위 경우는 많은 개발자들이 경험했을 거라 생각됩니다. 또는 본인이 이로 인해 어려움을 겪었을 수도 있고 또는 본인이 주인공일수도 있을 겁니다.

해달라는 대로 해줬는데 못 알아듣는 건 실력문제 아닌가?라고 생각하는 개발자가 은근히 많습니다.

이렇게 해달라고 했는데 다시 바꿔 달라고? 내가 왜 그래야 하는데?라고 생각하는 개발자도 있습니다.

그런데 중요한 것인 이렇게 소통이 어렵거나 고집이 쎈 개발자들은 어느 순간 안 좋은 소문이 날 수도 있습니다. 

근무시간 내라면 몇 번의 변경이라도 해주는 것이 맞습니다. 요청한 사람도 확인하면서 오류를 발견했기에 다시 요청을 할 수밖에 없거든요. 이런 상황에서 짜증을 내면서 두세 번 안 하게 해달라고 하면 요청한 사람은 이후 어떤 생각을 갖게 될까요?

내가 해 줄 수 있는 일이라면 내가 직업인이고 프로라면 당연히 해주는 게 맞습니다. "내가 왜 해줘야 되나요?"라는 표현을 자주 사용하게 되면 어느 누구도 요청을 하지 않게 될 겁니다. 그렇게 되면 할 일이 없게 되겠지요?

나는 개발도 해줬고 문서까지 만들어줬는데 뭘 더 해줘야 하나요? 본인들의 실력이 부족해서 이해를 못 하는데 내가 더 자세히 설명해줘야 하는 건 아닌 거 같다.라는 경우도 봤습니다.

그런데 이렇게 생각해 보세요. 내가 열심히 요구에 맞게 만들어줬는데 그걸 이용해서 개발해야 하는 다른 개발자가 문서만으로는 이해가 안돼서 사용을 못한다면 그 프로그램은 안 만든 것만 못합니다. 

잘 만들어줬으면 다른 개발자들이 잘 사용할 수 있게 최대한 쉽고 예제를 만들어 줘야 합니다. 모든 개발자가 다 똑같지 않기 때문입니다. 

이런 부분들로 일정에 치명적인 문제를 만드는 개발자들이 있습니다. 결국 본인 명성에 먹칠을 하는 겁니다.

내가 만든 프로그램이라면 다른 개발자들이 쉽게 이용할 수 있게 하는 것도 개발자의 실력이고 능력입니다.

근무시간 내라면 몇 번이라도 변경해 줄 수 있다면 직업인으로서 당연한 의무라 생각합니다.이걸 내가 왜 해줘? 가 아니라 내가 도움을 줄 수 있다면 당연히 만들어 줘야지 라는 생각이 개발자의 능력이라고 생각합니다.모 대형 프로젝트에 갔는데 위 경우가 모두 발생하고 있었습니다. 고객이나 사업관리는 프로젝트가 오픈 못할까 봐 엄청 스트레스를 받고 있는 상황이었습니다. 왜 그런지 그 안을 들여다보니 다들 잘하고 있었지만 서로가 소통을 못하고 있었습니다. 그저 선 하나만 연결해 주면 마음을 열고 잘해주는 개발자들이었는데 그 역할을 담당한 개발 총괄은 그저 남 탓만 하고 있었습니다. 개발자들의 능력을 인정하고 정중하게 부탁을 하면 보통 다들 도와줍니다. 어려워하지 말고 책을 읽고 느낀 대로 대화를 시도해 보세요. 삭막한 세상에 살다 보니 마음을 닫고 사는 개발자들도 있습니다. 하지만 그들도 인정받고 부탁을 받는다면 기꺼이 손을 내밀어 도움을 줄 겁니다.

 

4. 정리

신규(초급) 개발자에서 프로 개발자가 되고 싶다면,당연 개발 공부는 꾸준히 해야 하고 사람에 관한 공부를 위해 독서는 필수라 할 수 있습니다.그러기 위해서 시간 관리는 철저히 해야 한다고 다시 강조해 봅니다.

 

반응형