파이썬 진영 대표 웹 애플리케이션 프레임워크 Django  






                    



보편적으로 Layer단위로 나누고 그 안에서 도메인 별로 로직을 분리하는 스프링 과 다르게


장고는 도메인 단위로 분리한 뒤에 그 안에서 Layer를 나눈다.



Django는여러개의 App을 가진다 (현 이미지에서는 member orders payments product webPage가 장고의 애플리케이션이다.)


이러한앱들을 ROOT Application(현이미지에서는 configuration)의 settings.py 파일에서 @Configuration객체 에서 작업해는 것처럼  설정 작업을 해준다.


그리고 모든 HTTP 요청들은 ROOT Application의 url 을 통해서 각자의 App으로 로직을 타고 들어가는 방식이다. 



장고의 구조 이해의 가장 중요한 부분은 settings.py의 구성을 이해하는 것이다.


Settings.py의 구조 


1. INSTALLED_APPS

# Application definition
INSTALLED_APPS = [

#최초 장고 프로젝트 생성시 등록되있는 Application
'django.contrib.admin', # 장고의 꽃 관리자 App이다
'django.contrib.auth', # 장고 기본제공 회원 관리앱 장고프로젝트를 생성하는 동시에 회원관리하는 App 개발이 끝나있다.
'django.contrib.contenttypes', # http contenttype이 아니라 장고 App별 컨텐츠들 관리
'django.contrib.sessions', # 우리가 아는 그 세션,쿠키. 장고 회원관리 앱과 더불어 인증 로직을 지원한다.
'django.contrib.messages',
'django.contrib.staticfiles', # 장고의 정적 파일들 관리 해주는 app

'django_extensions', # 장고의 유틸리티 기능 확장 이건 다양해서 구글링 해서 찾아보시는게

'rest_framework', # 순수 장고는 html을 반환해주는 전통적인 웹 프로젝트를 목적으로 만들어 졌습니다.

# 그래서 API 형식에 대해서는 커스터마이징 해줘야하는 부분이 많아요

# 그래서 장고가 REST API를 지원해주는 APP DRF를 만들어 두었습니다 그게 이거입니다

'drf_yasg', # 장고 API 문서 자동화 도구 이건 다른 포스트에서 따로 설명드리겠습니다...
    

# 위 이미지에 만들어져있는 APP들을 등록한것 이렇게 등록안하면

# 스프링에서 @Bean 안붙이면 그냥 자바 객체이듯이 그냥 장고에서도 파이썬 패키지에 불과함
'member.apps.MemberAppConfig',
'product.apps.ProductAppConfig',
'orders.apps.OrdersAppConfig',
'payments.apps.PaymentsConfig',
'webpage.apps.WebpageConfig',

]





2. MIDDLEWARE



3. DATABASES






매개 변수의 갱신


신경망 학습의 목적은 손실함수의 값을 가능한 낮추는 매개변수를 찾는 것이다. 이는 곧 매개 변수의 최적 값을 찾는 문제이며, 이러한 문제를 푸는 것을 최적화(Optimization)라고 한다.




1. 확률적 경사 하강법(SGD)

1.1 개요

  


여기서 X는 갱신할 가중치 매개변수고

라운드 f / 라운드 x0 는 손실함수의 기울기 이다.


SGD는 기울어진 방향으로 일정 거리만 가겠다는 단순한 방법이다.

class SGD:
def __init__(self,lr=0.01):
self.lr=lr

def update(self,params,grads):
for key in params.keys():
params[key]-=self.lr*grads[key]

초기화 할때 받은 인수인 lr(learning rate)를 뜻한다.
이 학습률을 인스턴스 변수로 유지하고,
upgrade() 메서드로 SGD 과정에서 반복해서 불린다.


1.2 단점 

SGD는 단순하고 구현도 쉽지만, 문제에 따라서는 비효휼적일 때가 있다.


SGD의 단점은 비등방성(방향에 따라 성질, 즉 기울기가 달라지는 ) 함수에서는

탐색 경로가 비효율적이라는 것이다.




1.3 단점 개선 방법


1. 모멘텀




2. AdaGrad 





3. Adam



신경망 학습이란?

- 훈련 데이터로부터 가중치 매개변수의 최적값을 자동으로 획득하는 것


데이터 주도 학습

- 기계학습은 데이터에서 답을찾아서 패턴을 발견하고 데이터로 결론을 도출하는것


MINST :손글씨를 인식하는  머신러닝을 공부하기에 유명한 데이터 셋?

    • 손으로 쓴 5라는 것에서 패턴을 찾기란 어렵다.
    • 머신러닝이 효율적
    • 지도학습을 이용



지도학습이란?


지도 학습 (Supervised Learning)은 훈련 데이터(Training Data)로부터 하나의 함수를 유추해내기 위한 기계 학습(Machine Learning)의 한 방법이다. 훈련 데이터는 일반적으로 입력 객체에 대한 속성을 벡터 형태로 포함하고 있으며 각각의 벡터에 대해 원하는 결과가 무엇인지 표시되어 있다. 이렇게 유추된 함수 중 연속적인 값을 출력하는 것을 회귀분석(Regression)이라 하고 주어진 입력 벡터가 어떤 종류의 값인지 표식하는 것을 분류(Classification)라 한다. 지도 학습기(Supervised Learner)가 하는 작업은 훈련 데이터로부터 주어진 데이터에 대해 예측하고자 하는 값을 올바로 추측해내는 것이다. 이 목표를 달성하기 위해서는 학습기가 "알맞은" 방법을 통하여 기존의 훈련 데이터로부터 나타나지 않던 상황까지도 일반화하여 처리할 수 있어야 한다. 사람과 동물에 대응하는 심리학으로는 개념 학습(Concept Learning)을 예로 들 수 있다.

https://ko.wikipedia.org/wiki/%EC%A7%80%EB%8F%84_%ED%95%99%EC%8A%B5






손실함수 (loss Function)

학습을 통해 최적의 가중치 매개변수를 결정하기 위한 지표로 손실함수를 사용한다.

손실함수의 오차값을 가장 적게 만드는 것이 신경망의 학습목표이고




손실함수는 두가지


평균 제곱 오차 (mean squared error, MSE)





Y 는  신경망의 OUTPUT 이다 


파이썬 구현 함수 

def mean_square_error(y,t=list()):
return np.sum((y-t)**2)/t.size



교차 엔트로피 오차 (Croos Entroypy Error ,CEE)





왜 손실함수를 설정하는가?


숫자 인식의 경우도 우리의 궁극적인 목적은 높은 정확도를 끌어내는 매개변수 값을 찾는 것이다.

신경망 학습에서는 미분의 역활에 주목하야한다.
가상의 신경망이 있고 그 신경망의 어느 한 가중치 매개변수에 주목한다고 할때,
이때 그 가중치 매개변수의 손실함수의 미분이란 '가중치 매개변수의 값을 아주 조금  변화 시켰을때 손실함수가 어떻게 변하나 ?' 라는 의미 이다.

if 미분값이 음수면 그 가중치 매개변수를 양의 방향으로 변화 시켜 손실함수의 값을 줄일수 있다.

but  미분값이 0이면 매개 변수를 어느쪽으로 움직여도 손실함수의 값은 달라지지 않는다. 
그래서 그 가중치 매개 변수의 갱신은 거기서 멈춰야한다.

정확도를 지표로 삼으면 미분이 대부분의 장소에서 0이 되버린다.


반면에 손실함수를 지표로 삼는다면 매개변수의 값이 조금 변하면 그에 반응하여 손실 함수의 값도 0.9742.... 처럼 연속적으로 변화 하는 것이다.

계단 미분 함수의 미분은 대부분의 장소에서 0이다 그결과 계단함수를 손실함수 로 사용하면 아무런 효과가 없게 된다.


그렇기에 시그모이드 함수의 미분은 연속적으로 변하고 곡선의 기울기도 연속적으로 변한다




'Computer Science > Artificial Intelligence' 카테고리의 다른 글

기계 학습 관련 기술들  (0) 2018.10.14
인공신경망이란 무엇인가  (0) 2018.09.16
퍼셉트론이란 무엇인가  (0) 2018.09.16

1. SELECT 의 기본 구조 



Select 구문의 순서는 위의 그림과 같다.


    Select           //조회할것이다.

    *                   // 어떤 데이터를

    from  Table  // 테이블로 부터

    where          // 어떤 조건을 가진

    group by      // 어떤데이터들을  특정 column기준으로 묶는다.

    having          // 특정 조건을 가지고 있는 row 만 추출한다

    Order By     // 해당 row 들을 어떤 컬럼을 기준으로 정렬할 것이다



2. Join 이란 





SQL 에서 다양한 조인 연산이 존재한다. 


Cross join

inner join

outer join

self join




이들중 기능적인 관점으로 분류한 것은 


Cross Join

Inner Join

Outer Join 


이렇게 3가지 인데 


Cross join 은 사실상 안쓰이는 거니 논외로 친다.


2.1 INNER JOIN

조인되는 두 테이블 모두에 데이터가 존재해야 row를 가져온다.

두 테이블중 한 곳이라도 NULL 이면 데이터를 조회 하지 않는다.


select * from Employees E 

inner join Departments D

on E.dept_id=D.dept_id


2.2 OUTER JOIN (with LEFT RIGHT JOIN)

FULL OUTER 

조인 이 되는 두 테이블에서 NULL을 허용한다. 

이렇게 쓰는 경우는 잘없음


LEFT OUTER   

구동 테이블의 NULL을 허용하지 않음


RIGHT OUTER

내부 테이블의 NULL을 허용하지 않음 








성능을 고려한 알고리즘 

1. Nested Loops 

SQL에서 JOIN은 한번에 두개의 테이블만 결합 하므로 본질적으로 이중 반복과 같은 의미이다.


그렇기 때문에 Join 쿼리의 수행시간은 table(A)* table(B)  이다. 


여기서 접근하는 레코드의 수는 A * B 와 B * A 는 서로 같다 

그러나 실제 성능에서는  좀 다른 의미를 가질수 있다. 


두테이블이 서로 조인할때 결합키에 인덱스가 존재한다면 해당 인덱스를 통해 DBMS는 내부 테이블을 완전히 순환 하지 않아도 된다.


이상적인 경우는 구동테이블 (from A 테이블)의 레코드 한개에 내부테이블(join B 테이블)이 

1대1 관계인 경우이다 .


이 경우 반복없이 


1. A 에서 row 조회 

2. 인덱싱으로 B 조회


A *2 번의 실행 시간 이 걸린다.


결론 :

 내부 테이블의 결합키에 인덱싱이 존재한다면 

구동테이블은 작은 테이블 

내부테이블은 큰 테이블 로  

조인 할수록 

내부테이블의 인덱싱을 탐색하여 반복 생략 효과가 커진다. 




1.2 Nested Loops 의 단점

히트되는 레코드가 너무 많은 경우 기대한 만큼의 응답시간이 안나오기도 한다.

예를 들어

점포테이블과 주문 테이블의 경우

하나의 점포에 대해 여러개의 주문이 대응하므로 

구동테이블은 작은 점포테이블

결합키는 점포테이블의 ID,

내부 테이블은 큰 주문테이블로 JOIN  할 경우 

위 설명대로라면 좋은 성능을 기대할수 있지만


한 점포당 수백 수천건의 주문 row 가 히트한다면 

반복 횟수가 너무 많아서 결국 성능이 떨어진다.


이런경우에는 해시를 통해 해결할수 있다.


2. HASH

해쉬 방식은 먼저 읽어들인 구동테이블의 ID 로 

해시 테이블을 만들고 이어서 내부테이블을 읽어 들여서 해시값이 일치하는지를 확인하는 방식이다.

이 경우 해시라는 방식 특성상 속도가 조회속도가 좋지만 문제는 

메모리를 크게 소모한다.

메모리가 부족하면 저장소를 사용하므로 지연이 발생한다.


유용한경우

    1. 구동테이블로 쓸만한 충분히 작은 테이블이 존재하지 않는경우
    2. 내부테이블이 매우 거대한경우 (ex = >점포 : 주문) 

Caution 


Hash 결합은 반드시 양쪽 테이블의 레코드를 전부 읽어야 하므로 

테이블 풀스캔이 사용되는 경우가 많다.

그렇기에 풀스캔에 걸리는 시간도 고려해봐야한다.




지연 로딩 과 즉시 로딩 (Lazy & Eager) 그리고 1+N 문제


장고는 Lazy Eager 하다는 표현을 안쓰고

쿼리셋에서 쓰는 함수들도 inner outer를 사용한다는 것을 유추할만한 네이밍이 없다.

좋다 나쁘다 할것없이 그냥 그러하다.


    select_related()
    • ForeignKey, OneToOneField 관계에서 활용
    • ForeignKey/OneToOneField 관계에서 Lazy하게 쿼리하지 않고, DB단에서 INNER JOIN 으로 쿼리할 수 있다.
  • prefetch_related()
    • ManyToManyField, ForeignKey의 reverse relation 에서 활용
    • 각 관계 별로 DB 쿼리를 수행하고, 파이썬 단에서 조인을 수행한다.
https://wayhome25.github.io/django/2017/06/20/selected_related_prefetch_related/



N+1 Query Problem
N+1 쿼리 문제, N+1 SELECT 문제, N+1 문제
  • 쿼리 1번으로 N건을 가져왔는데, 관련 컬럼을 얻기 위해 쿼리를 N번 추가 수행하는 문제
  • 쿼리결과 건수마다 참조 정보를 얻기 위해 건수만큼 반복해서 쿼리를 수행하게 되는 문제
  • DB쿼리 수행비용(횟수)이 크기 때문에, eager 로딩 등의 방법으로 해결하는 것이 권장됨





참고 문헌

  • http://www.sqlprogram.com/Basics/sql-join.aspx
  • SQL 레벨업 [저자 미크, 역자 윤인성]
  • 자바 ORM 표준 JPA 프로그래밍 [저자 김영한]
  • https://wayhome25.github.io/django/2017/06/20/selected_related_prefetch_related/




3.1 NIST의 클라우드 컴퓨팅 참조 아키텍쳐




클라우드 컴퓨팅(cloud computing) 아키텍처는 아래로부터 물리적 시스템계층, 가상화계층(하이퍼바이저), 로비저닝 계층, 서비스 관리체계 계층,그리고 서비스 계층의 5계층으로 구분합니다.









2.1 클라우드 컴퓨팅의 구성요소

클라우드 제공자
클라우드 클라이언트 또는 클라우드 단말
클라우드 네트워크
클라우드 보안
클라우드 서비스 브로커 
클라우드 소비자
클라우드 서비스 소유자
클라우드 자원 관리자



2.2 클라우드 컴퓨팅의 특성

주문형 자가 서비스 (on -demand - self -service)

폭넓은 네트워크 접근(broad network access)

자원 풀링 (resource pooling)

신속한 탄력성(rapid elasticity)

측정된 서비스 (measured service)


2.3 서비스 모델 

  • SaaS (Software as a Service)

완전한 서비스를 클라우드 환경 기반에서 제공


  • PaaS (Platform as a Service)

RDS 와 같은 서비스 개발에 필요한 플랫폼을 제공 



  • IaaS(Infrastructure as a Service)

기본만 갖춰진 인프라 환경의 컴퓨팅 자원을 제공 


  • Daas(Desktop as a Service)

고객의 데스크탑이 클라우드 인프라 상에서 VM 형태로 실행되며

사용자는 다양한 경량 클라이언트나 제로 클라이언트를 이용해 데스크탑에 접근할수 있다.






2.4 전개 모델 (Deployment Model)

NIST 의 Deployment Model은 프라이빗 커뮤니티 퍼블릭, 하이브리드 클라우드로 구분할수 있다.


  1. 프라이빗 클라우드(private cloud)
  2. 커뮤니티 클라우드(community cloud)
  3. 퍼블릭 클라우드(public cloud)
  4. 하이브리드 클라우드 (hybrid cloud)
  5. 모바일 클라우드(moblie cloud)



 






'Computer Science > Cloud Computing' 카테고리의 다른 글

클라우드 컴퓨팅 참조 아키텍쳐  (0) 2018.09.30
클라우드 컴퓨팅의 개요  (0) 2018.09.30

1. 클라우드 컴퓨팅 의 개요

1.1 클라우드 컴퓨팅은 IT 자원 렌탈 샵이다.


  • 컴퓨팅 자원 : EC2
  • 스토리지 자원 : S3 
  • 네트워크 자원 : Virtual Private Cloud(VPC) 
  • 데이터 베이스 : RDS


1.2 주요 개념 및 용어 

  • 클라우드 
원격으로 iT 자원을 준비해 확작,측정 가능한 방식으로 제공하는 IT환경 

  • Virtual Machine
클라우드 컴퓨팅 환경에서는 하나의 물리적 서버상에 하이퍼바이져라고 하는 SW가 여러개의 VM을 생성하여 사용자에게 제공을 하게 된다.
VM상에서는 서로 다른 OS 를 사용할수 있으며 
컴퓨팅 자원을 서로 적절히 할당하여 사용할수 있다. 

  • 수평 확장 
Scale Out 
Scale In


  • 수직 확장

Scale Up

Scale Down


  • 클라우드 서비스 

IaaS // 아이아스

PaaS // 파스

SaaS // 사스



1.3 클라우드 컴퓨팅의 장점

  1. 투자 및 비용감소
  2. 확장석 증가
  3. 가용성 및 신뢰성 증가
  4. 이동성 증가
  5. 보안 강화




2.인공신경망


  1. 퍼셉트론으로 복잡한 함수도 표현할수 있다 (이론상으로)

  2. 가중치를 설정하는 작업은 여전히 사람이 수동으로 해야한다는 문제점이 여전히 있다.


인공신경망은 2번에 해당하는 문제점을 해결해준다.


2.1 신경망의 예

  • 입력층, 은닉층, 출력층 3개로 나누어져있다.

b= 편향  , bias 



2.2 활성화 함수의 등장 Activation Function

    • 활성화함수 식

      • y= h(a)

      • a= b+w1*x1+w2*x2





2.3 활성화 함수 시그모이드 함수

    • 시그모이드 함수 
h(x)= 1/1+exp(-x)


2.4 계단 함수 구현하기



import matplotlib.pylab as plt


def step_function(x):
return np.array(x > 0, dtype=np.int)


x = np.arange(-5.0, 5.0, 0.1)
y = step_function(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()



계단 함수는 어느 경계점을 기점으로 

출력값을 0,1  두가지 값으로 바꿔준다.





2.5 시그모이드 함수 구현


def sigmoid(x0):
return 1 / (1 + np.exp(-x0))


x = np.array([-1.0, 1.0, 2.0])
sigmoid(x)

x = np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x, y)
plt.ylim(-0.1, 1.1)
plt.show()


시그모이드 함수와 계단함수의 가장 큰차이는

매끄러움의 차이이다


부드러운 곡선이며 (=미분가능한 함수이며)


두 함수는 모두 입력값에 관계없이 0~1 사이의 값을 출력해준다는 공통점이 있다.



시그모이드는 비선형 함수 이다.


인공 신경망에서는 활성화 함수로 비선형 함수를 사용해야한다.

선형함수를 이용하면  신경망의 층을 깊게하는 의미가 없어지기 때문이다.


층을 쌓는 혜택을 얻고싶다면 활성화 함수로 반드시 비선형 함수를 사용해야한다.




2.6 출력층 설계하기


  • 신경망은 분류와 회귀 모두에 이용할수 있다.
  • 다만 둘중 어떤 문제냐에 따라 출력층에서 사용하는 활성화 함수가 달라진다.
    • 항등함수
    • 소프트맥수 함수


NOTE : 기계학습 문제는 분류(Classification)와 회귀(regression)로 나뉩니다. 

분류는 불연속 수치 분석 (성별 :남or여)

회귀는 연속적인 수치 분석 (몸무게 50kg ~ 80kg)







+ Recent posts