Programista_57.pdf
(
15208 KB
)
Pobierz
CO ROBI TWÓJ PROGRAM I CZEMU TAK WOLNO • GANN W NATARCIU • STREFA CTF
Index: 285358
www
•
programistamag
•
pl
Magazyn
programistów
i
liderów
zespołów
IT
2
/
2017
(
57
)
marzec/kwiecień
Cena 23,90 zł (w tym VAT 5%)
P
O
Z
N
A
J
U
MB
AC
O
Z
T
H
E
C
O
GW
R
SZC
Ś
ZEGÓŁY
W
OD
R
KU
OR
KS
!
EDYTORIAL
Algorytmiczne czarne
skrzynki
Podczas naszych programistycznych podbojów
niekiedy zdarza nam się stanąć przed koniecznością
rozwiązania jakiegoś skomplikowanego problemu.
O ile algorytmika bardzo często wyciągnie do nas
pomocną dłoń, o tyle nadal możemy się spotkać
z sytuacją, gdzie prawidłowe opisanie relacji po-
między wejściem a oczekiwanym wyjściem jest
niezwykle trudne. Na ratunek przychodzą wtedy
sieci neuronowe i algorytmy ewolucyjne. Podstawy
działania tego typu narzędzi z punktu widzenia im-
plementującego je programisty wyłożył Grzegorz
Grzęda w swoim artykule „GANN w natarciu, czyli
genetycznie programowane sieci neuronowe”.
Gotową już implementację warto sprawdzić
pod kątem wydajności. Optymalizacja nie jest
sztuką prostą i wiąże się z wieloma nieintuicyjny-
mi kwestiami. Warto pamiętać, że już w przypadku
języka C, pomimo relatywnie niskiego poziomu
abstrakcji w porównaniu do innych technologii, od
prawdziwego sprzętu dzieli nas naprawdę długa
droga. „Co robi Twój program i dlaczego tak wol-
no?” to opracowanie na temat wydajności, o której
w tym numerze pisze Maciej Czekaj.
Na temat wszechstronności Pythona w róż-
nych zastosowaniach można powiedzieć bardzo
wiele, ale czy mieliśmy świadomość, że posiada on
zestaw narzędzi do opisywania sprzętu? MyHDL
to paczka do wysokopoziomowego modelowania
umożliwiająca konwersję kodu do VHDLa lub Veri-
loga. Kilka przykładowych implementacji z użyciem
wspomnianego toolkitu pokazał i omówił w swoim
artykule Marek Sawerwain.
To naturalnie nie wszystko, co można znaleźć
w bieżącym numerze „Programisty”. Kontynuuje-
my bowiem serię na temat przetwarzania sygna-
łów cyfrowych, dużo miejsca poświęcono również
innym rozwiązaniom z zakresu Webdev. Zaprasza-
my do lektury!
Michał Leszczyński
BIBLIOTEKI I NARZĘDZIA
GANN w natarciu, czyli genetycznie programowane sieci neuronowe
Grzegorz Grzęda
Pakiet MyHDL. Python w służbie sprzętu i układów FPGA
Marek Sawerwain
14
4
PROGRAMOWANIE SYSTEMOWE
Co robi Twój program i czemu tak wolno?
Maciej Czekaj
22
PROGRAMOWANIE APLIKACJI WEBOWYCH
CMS as a Service, czyli Umbraco w chmurze!
Marcin Zajkowski
Microsoft Bot Framework. Tworzenie inteligentnych kanałów komunikacyjnych
Dawid Borycki
Jak rozproszyć swoją web aplikację?
Maciej Nabożny
Transmisja danych dźwiękiem w JavaScript od podstaw. Część 2: Web Audio API
Robert Rypuła
48
42
36
30
FELIETON
Zawód: Data Scientist, czyli jak zostać jednorożcem
Łukasz Kobyliński
66
KLUB LIDERA IT
Jak sprzedać refaktoryzację? Przypadek Nordea Bank AB
Michał Bartyzel, Łukasz Korczyński
68
STREFA CTF
BSidesSF 2017 – Pinlock
Jarosław Górny
74
PLANETA IT
Angielski dla programistów. Lekcja 2
Łukasz Piwko
78
KLUB DOBREJ KSIĄŻKI
WordPress i Joomla! Zabezpieczanie i ratowanie stron WWW
Mariusz "maryush" Witkowski
80
PRENUMERATA
Zamów prenumeratę magazynu Programista
przez formularz na stronie:
http://programistamag.pl/typy-prenumeraty/
lub zrealizuj ją na podstawie faktury Pro-forma. W spawie faktur Pro-forma prosimy kontaktować się z nami drogą mailową:
redakcja@programistamag.pl.
Prenumerata realizowana jest także przez
RUCH S.A.
Zamówienia można składać bezpośrednio na stronie:
www.prenumerata.ruch.com.pl
Pytania prosimy kierować na adres e-mail:
prenumerata@ruch.com.pl
lub kontaktując się telefonicznie z numerem:
801 800 803
lub
22 717 59 59,
godz. 7:00 – 18:00 (koszt połączenia wg taryfy operatora).
Magazyn Programista wydawany jest przez Dom Wydawniczy Anna Adamczyk
Wydawca/Redaktor naczelny:
Anna Adamczyk (annaadamczyk@programistamag.pl).
Redaktor prowadzący:
Michał Leszczyński (mleszczynski@programistamag.pl).
Korekta:
Tomasz Łopuszański.
Kierownik produkcji:
Havok.
DTP:
Havok.
Dział reklamy:
reklama@programistamag.pl,
tel. +48 663 220 102, tel. +48 604 312 716.
Prenumerata:
prenumerata@programistamag.pl.
Współpraca:
Michał Bartyzel, Mariusz Sieraczkiewicz, Dawid Kaliszewski, Marek Sawerwain, Łukasz Mazur, Łukasz
Łopuszański, Jacek Matulewski, Sławomir Sobótka, Dawid Borycki, Gynvael Coldwind, Bartosz Chrabski, Rafał Kocisz,
Michał Sajdak, Michał Bentkowski, Mariusz „maryush” Witkowski, Paweł „KrzaQ” Zakrzewski.
Adres wydawcy:
Dereniowa 4/47, 02-776 Warszawa.
Druk:
Drukarnia Edit ul. Dworkowa 2, 05-462 Wiązowna, Nakład: 4500 egz.
Nota prawna
Redakcja zastrzega sobie prawo do skrótów i opracowań tekstów
oraz do zmiany planów wydawniczych, tj. zmian w zapowiadanych
tematach artykułów i terminach publikacji, a także nakładzie
i objętości czasopisma.
O ile nie zaznaczono inaczej, wszelkie prawa do materiałów i znaków
towarowych/firmowych zamieszczanych na łamach magazynu
Programista są zastrzeżone. Kopiowanie i rozpowszechnianie ich bez
zezwolenia jest Zabronione.
Redakcja magazynu Programista nie ponosi odpowiedzialności za
szkody bezpośrednie i pośrednie, jak również za inne straty i wydatki
poniesione w związku z wykorzystaniem informacji prezentowanych na
łamach magazynu Programista.
BIBLIOTEKI I NARZĘDZIA
GANN w natarciu, czyli genetycznie
programowane sieci neuronowe
Programowanie jest nierozerwalnie związane z rozwiązywaniem rzeczywistych pro-
blemów. Stosując różne techniki, jesteśmy w stanie zamodelować skomplikowane
procesy, wyszukiwać relacje między obiektami oraz przetwarzać gromadzone dane
z ogromną szybkością. Jednak co zrobić, gdy nie istnieje optymalny przepis na roz-
wiązanie danego problemu? Gdy ograniczone zasoby nie pozwalają na sprawdzenie
wszystkich możliwości, jak mieć pewność, że wyznaczone rozwiązanie jest prawi-
dłowe? Pomocne mogą okazać się algorytmy ewolucyjne oraz sieci neuronowe.
C
elem tego artykułu jest pokazanie, jak w prosty sposób
zaimplementować skuteczne mechanizmy sztucznej inte-
ligencji. O ile istnieją w Internecie niezliczone biblioteki pro-
gramistyczne zarówno do sieci neuronowych, jak i algorytmów ge-
netycznych, to trudno znaleźć przepis na małe, proste rozwiązania.
Prezentowany kod jest przygotowany w języku Java, jednak nic nie
stoi na przeszkodzie, aby czytelnik przepisał go na dowolnie inny.
Języki obiektowe w naturalny sposób oddają dynamikę związaną
np. podczas „reprodukcji” lub doboru naturalnego w algorytmach
genetycznych. Nie oznacza to jednak, że implementacje w C przed-
stawionych niżej rozwiązań będą nieefektywne. Własna wydajna
biblioteka w C np. na mikrokontroler będzie w stanie skutecznie
przetwarzać dane, bez znacznego ustępowania profesjonalnym,
prekompilowanym bibliotekom ze sprzętową akceleracją.
W ramach tego artykułu pokażę, jak implementować proste roz-
wiązania sieci neuronowych oraz algorytmów ewolucyjnych. Arty-
kuł ten można potraktować jak mapę drogową, wprowadzającą we
wspaniały świat implementowania metod sztucznej inteligencji.
Przecież każda podróż zaczyna się od pierwszego kroku…
nie powstałe iloczyny są sumowane. Suma tych produktów jest
podawana jako argument tak zwanej funkcji aktywacji, która służy
podejmowaniu decyzji przez perceptron. Decyzja jest kierowana
na wyjście (Rysunek 2). Pojawia się również dodatkowy składnik.
Symbolicznie zaznaczono go jako iloczyn wagi przez liczbę 1. Jest
to tzw. polaryzacja (ang.
bias)
perceptronu. Bez tego składnika per-
ceptron nie mógłby wykonać wszystkich operacji.
Rysunek 2. Szczegółowa budowa perceptronu
PODSTAWY SIECI NEURONOWYCH
Perceptron
Idea sieci neuronowych polega głównie na symulowaniu zachowa-
nia (ludzkiego) mózgu. Jeśli popatrzy się z odpowiedniej perspek-
tywy na ten wyjątkowy narząd, zauważymy, że jest to po prostu
sieć komórek nerwowych odpowiednio połączonych ze sobą. Dla
potrzeb tego artykułu taki poziom szczegółów jest wystarczający.
Każda sieć, nawet ta bardzo skomplikowana, składa się z poje-
dynczych neuronów. Najprostszą odmianą neuronu jest zapropo-
nowany pod koniec lat 50. ubiegłego wieku model zwany
percep-
tronem.
Jest to prosta jednostka obliczeniowa, posiadająca N wejść
(przynajmniej jedno) oraz jedno wyjście (Rysunek 1).
Osobny komentarz należy się wspomnianej funkcji aktywacji. Tak
naprawdę jest to zwykła funkcja, która przetwarza wyliczoną sumę
do postaci zgodnej z formatem wyjściowym. Na przestrzeni lat prze-
badano wiele funkcji, które można by zastosować w roli aktywato-
ra odpowiedzi perceptronu. Ostatecznie opracowano zbiór funkcji,
które dobrze sprawdzają się w tej roli. Będą one szerzej omówione
w drugiej części artykułu. Teraz posłużymy się najprostszą z nich,
czyli funkcją
sign(x).
Funkcję tę opisuje zależność:
sign(x > 0)
= 1, sign(x < 0) = -1
oraz
sign(0) = 0.
Można też przyjąć
prostszy wariant:
sign(x ≥ 0) = 1
oraz
sign(x < 0) = -1.
Kod implementujący funkcjonalność perceptronu pokazano na
Listingu 1.
Listing 1. Podstawowy kod perceptronu
public class
Perceptron{
private
double[]
weights;
public
double
compute(double[] x){
double
sum
=
0.0;
for(int
i
=
0;
i
<
x.length; i++){
sum
+=
x[i]
*
weights[i];
}
sum
+=
weights[x.length
+
1];
return
(sum >
0)
?
1
: -1;
}
Rysunek 1. Pojedynczy perceptron
Klasyczny perceptron działa według następującej zasady: wartości
wejściowe zostają przemnożone przez odpowiednie wagi, następ-
}
4
/
2 . 2017 . (57)
/
Plik z chomika:
Pinger
Inne pliki z tego folderu:
Programista_7_Digital.rar
(99757 KB)
Programista_18_d.pdf
(39976 KB)
Programista_7_mobi_High.mobi
(44150 KB)
Programista_0_2012.pdf
(31956 KB)
Programista_32.mobi
(30636 KB)
Inne foldery tego chomika:
70pus7304 firmware
Amiga na PC
Android
Android - Firmware
Backup
Zgłoś jeśli
naruszono regulamin